gpt4 book ai didi

iphone - 如何停止 NSRunLoop

转载 作者:行者123 更新时间:2023-12-01 19:16:05 25 4
gpt4 key购买 nike

我有一个每 5 分钟调用一次的后台方法。
该方法使用NSURLConnection将数据发送到 Web 服务。
在那种方法中,我有这个代码:

...
conn = [[NSURLConnection alloc] initWithRequest:req delegate:self startImmediately:NO];
NSPort* port = [NSPort port];
NSRunLoop* rl = [NSRunLoop currentRunLoop];
[rl addPort:port forMode:NSDefaultRunLoopMode];
[conn scheduleInRunLoop:rl forMode:NSDefaultRunLoopMode];
[conn start];
[rl run];
...

因为我在后台调用 WS,所以我使用此代码,因为没有此委托(delegate)方法(didReceiveData、didFail ... 等)永远不会被调用。我从 http://www.cocoaintheshell.com/2011/04/nsurlconnection-synchronous-asynchronous/ 得到这个技巧

问题 是当 5 分钟过去并且第一次调用此方法时,它不会等待接下来的 5 分钟再次调用,而是几乎每秒调用一次 Web 服务。
我认为我应该以某种方式使这个 NSRunLoop 无效,但不知道如何以及在哪里?

最佳答案

如果您想知道为什么在您的连接处于后台时没有调用委托(delegate)方法:如果您将连接放在后台队列中,队列完成后它会被推开,因此您不会得到您的委托(delegate)回调。连接必须在主队列中,以便它保持在运行循环中以发生回调。或者,在您的情况下,创建它自己的运行循环。

如果您不想处理运行循环,您所要做的就是将连接放在主队列中:

dispatch_async(dispatch_get_main_queue(), ^(void){
conn = [[NSURLConnection alloc] initWithRequest:req delegate:self startImmediately:NO];
[conn start];
}

然后你应该得到你的委托(delegate)回调。

关于iphone - 如何停止 NSRunLoop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13266575/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com