如何阻止NSRunLoop

时间:2012-11-07 09:19:10

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

我从http://www.cocoaintheshell.com/2011/04/nsurlconnection-synchronous-asynchronous/得到了这个技巧

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

2 个答案:

答案 0 :(得分:3)

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

如果您不想处理runloops,您只需将连接放在主队列上:

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

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

答案 1 :(得分:0)

供参考和原始问题如何使[[NSRunLoop currentRunLoop] run]无效:您不能。

setuid()如何实现可以终止的运行循环:

BOOL shouldKeepRunning = YES;        // global
NSRunLoop *theRL = [NSRunLoop currentRunLoop];
while (shouldKeepRunning && [theRL runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]);