我有一个每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无效,但不知道如何以及在哪里?
答案 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]]);