正如标题所说,NSRunLoop 的 runMode:beforeDate: 不会等待。我应该怎么做才能让线程等待 NSRunLoop。
我正在后台线程上运行一个方法:
[self performSelectorInBackgroundselector(performOperation withObject:nil];
- (void)performSynchronousOperationoperation *)operation
{
operationComplete = NO;
// Now wait for response
NSRunLoop *theRL = [NSRunLoop currentRunLoop];
while (!operationComplete && [theRL runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]);
return;
}
后台线程不会在 while 循环中等待。我有什么遗漏吗?
Best Answer-推荐答案 strong>
几个观察:
为了让运行循环保持活跃,你需要添加一个源代码。例如,您可以这样做:
[[NSRunLoop currentRunLoop] addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode];
不幸的是,这也将阻止 runMode 完成,直到端口从运行循环中删除。因此,您要么必须在设置 operationComplete 时删除此源。或者不要使用这个 runMode 方法(例如,可能使用 CFRunLoopRunInMode Core Foundation 函数,如 Threading Programming Guide: Run Loops 中的 list 3-2 所示)。
我对在您的方法名称中使用“同步”感到困惑。如果你在后台线程上做一些同步的事情,那么你不需要做任何这些运行循环的东西。只有在后台线程上执行异步任务时才需要这样做,即使那样,通常也有更好的方法。
也许您可以通过代码示例解释您要解决的问题,我们可以提供更多帮助。
见 Rob Mayoff's answer了解其他见解。
关于ios - NSRunLoop 运行模式 :beforeDate: doesn't wait,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/35123220/
|