正如标题所说,NSRunLoop的runMode:beforeDate:不等待。我该怎么做才能让线程等待NSRunLoop。
我正在后台线程上运行一个方法:
[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循环中等待。有什么我想念的吗?
答案 0 :(得分:2)
有几点意见:
要使运行循环保持活动状态,您需要为其添加源。例如,你可以这样做:
[[NSRunLoop currentRunLoop] addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode];
不幸的是,这也会使runMode
无法完成,直到从运行循环中删除端口为止。因此,您必须在设置operationComplete
时删除此来源。或者不要使用此runMode
方法(例如,可能使用CFRunLoopRunInMode
核心基础功能,如Threading Programming Guide: Run Loops中的清单3-2所示。
我对使用"同步"感到困惑。在您的方法名称中。如果您在后台线程上执行某些同步操作,那么您不需要执行任何此类runloop操作。只有在后台线程上执行异步任务时才需要这样做,即使这样,通常也有更好的方法。
也许您可以解释一下您尝试使用代码示例解决的问题,我们可以提供更多帮助。
有关其他见解,请参阅Rob Mayoff's answer。
答案 1 :(得分:1)
以下是Apple API docs对此方法的说法:
如果没有输入源或定时器附加到运行循环,则此方法立即退出并返回false
这就是为什么它不等待。不知道你想在这里实现什么。但是,如果你想做这样的等待,我建议使用其他方法,如dispatch_semaphore
。