iphone - 如何停止 NSRunLoop

标签 iphone objective-c ios nsurlconnection nsrunloop

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

相关文章:

objective-c - NSMutableDictionary 实例变量不在循环外保留键值

javascript - 将变量从 objective-c 返回到 javascript

ios - 在 Swift 中移动 UITableView 位置

iphone - CGContext画线: CGContextFillPath not working?

iphone - 删除NSMutableDictionary中的元素将删除其他字典

ios - 集成开发环境错误 : Variable undefined but defined in an if statement

ios - 如何在另一个框架内添加一个框架(Umbrella Framework)

c# - Xamarin 代码生成设计器正在破坏应用程序

iphone - 哪种视频格式最紧凑,同时仍兼容 iOS 播放?

iphone - iOS 游戏引擎