由于标题说NSRunLoop的runMode:beforeDate:不等。我应该怎么做才能让线程等待NSRunLoop。NSRunLoop runMode:beforeDate:不要等待
我运行在后台线程的方法:
[self performSelectorInBackground:@selector(performOperation:) withObject:nil];
- (void)performSynchronousOperation:(operation *)operation
{
operationComplete = NO;
// Now wait for response
NSRunLoop *theRL = [NSRunLoop currentRunLoop];
while (!operationComplete && [theRL runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]);
return;
}
后台线程不会在while循环等待。有什么我失踪?
是的,我想在后台线程中执行异步网络操作。但线程在while循环等待下面的实现,我不明白为什么。 ' - (无效)performSynchronousOperation {' '[操作开始]; //'网络操作将开始(操作是一个类,其基类是的NSOperation并实现它的“主”方法) //现在等待回复#1:NSRunLoop * theRL = [NSRunLoop currentRunLoop];' 'while(!operationComplete && [theRL runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]); //线程在这里等待。不知道为什么?' '}' –
如果你在做一个异步网络操作,如果在后台线程上调度NSURLConnection,你只需要经历这个后台线程的愚蠢行为。但是现在已经废弃了,你应该使用'NSURLSession',在这种情况下你可以完全去掉这个后台线程代码。如果你将它包装在一个'NSOperation'中,那么你应该子类NSOperation并使其成为一个异步操作,然后享受操作依赖关系,maxConcurrentOperationCount等。参见http://stackoverflow.com的后半部分/ a/21205992/1271826举例说明如何做到这一点。 – Rob
如果你已经添加了端口到'NSRunLoop',这将保持后台线程的运行循环不会退出,但是也会阻止'runMode:beforeDate:'终止。这就是为什么我建议'CFRunLoopRunInMode'。但是这一点是没有意义的,因为无论如何,当网络请求正在进行时,你确实不应该在运行循环中旋转。看到我以前的评论。 – Rob