首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何阻止NSRunLoop

如何阻止NSRunLoop
EN

Stack Overflow用户
提问于 2012-11-07 09:19:10
回答 2查看 1.6K关注 0票数 1

我有一个背景方法,每5分钟一次。

该方法使用NSURLConnection将数据发送到web服务。

在这种方法中,我有以下代码:

代码语言:javascript
复制
...
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失效,但不知道方法和地点?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-07 09:29:51

如果您想知道为什么在连接处于后台时不调用委托方法:如果将连接放在后台队列中,则在队列完成后它就会被推开,因此您不会得到委托回调。连接必须位于主队列中,以便在run循环中进行回调。或者,在您的例子中,创建它自己的运行循环。

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

代码语言:javascript
复制
dispatch_async(dispatch_get_main_queue(), ^(void){
    conn =  [[NSURLConnection alloc] initWithRequest:req delegate:self startImmediately:NO];
    [conn start];
}

那么,您应该得到您的委托回调。

票数 3
EN

Stack Overflow用户

发布于 2015-06-11 13:47:14

作为参考和最初的问题,如何使一个[[NSRunLoop currentRunLoop] run]失效:您不能。

见文件如何实现可以终止的运行循环:

代码语言:javascript
复制
BOOL shouldKeepRunning = YES;        // global
NSRunLoop *theRL = [NSRunLoop currentRunLoop];
while (shouldKeepRunning && [theRL runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13266575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档