我有一个每 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/