1

我有一个每 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,所以我使用此代码,因为没有此委托方法(didReceiveData、didFail ... 等)永远不会被调用。

我从http://www.cocoaintheshell.com/2011/04/nsurlconnection-synchronous-asynchronous/

得到 这个技巧问题是当 5 分钟过去了,这个方法第一次被调用它不等待下一个 5 分钟再次调用,但几乎每秒调用一次网络服务。
我认为我应该以某种方式使这个 NSRunLoop 无效,但不知道如何以及在哪里?

4

2 回答 2

3

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

如果您不想处理运行循环,您只需将连接放在主队列中:

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

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

于 2012-11-07T09:29:51.963 回答
0

作为参考和原始问题如何使 a 无效[[NSRunLoop currentRunLoop] run]:你不能。

请参阅文档如何实现可以终止的运行循环:

BOOL shouldKeepRunning = YES;        // global
NSRunLoop *theRL = [NSRunLoop currentRunLoop];
while (shouldKeepRunning && [theRL runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]);
于 2015-06-11T13:47:14.537 回答