我有一个背景方法,每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失效,但不知道方法和地点?
发布于 2012-11-07 09:29:51
如果您想知道为什么在连接处于后台时不调用委托方法:如果将连接放在后台队列中,则在队列完成后它就会被推开,因此您不会得到委托回调。连接必须位于主队列中,以便在run循环中进行回调。或者,在您的例子中,创建它自己的运行循环。
如果不想处理运行循环,只需将连接放在主队列上:
dispatch_async(dispatch_get_main_queue(), ^(void){
conn = [[NSURLConnection alloc] initWithRequest:req delegate:self startImmediately:NO];
[conn start];
}那么,您应该得到您的委托回调。
发布于 2015-06-11 13:47:14
作为参考和最初的问题,如何使一个[[NSRunLoop currentRunLoop] run]失效:您不能。
见文件如何实现可以终止的运行循环:
BOOL shouldKeepRunning = YES; // global
NSRunLoop *theRL = [NSRunLoop currentRunLoop];
while (shouldKeepRunning && [theRL runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]);https://stackoverflow.com/questions/13266575
复制相似问题