NSRunLoop runMode:beforeDate:不等待

时间:2016-02-01 04:55:44

标签: ios objective-c multithreading

正如标题所说,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循环中等待。有什么我想念的吗?

2 个答案:

答案 0 :(得分:2)

有几点意见:

  1. 要使运行循环保持活动状态,您需要为其添加源。例如,你可以这样做:

    [[NSRunLoop currentRunLoop] addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode];
    

    不幸的是,这也会使runMode无法完成,直到从运行循环中删除端口为止。因此,您必须在设置operationComplete时删除此来源。或者不要使用此runMode方法(例如,可能使用CFRunLoopRunInMode核心基础功能,如Threading Programming Guide: Run Loops中的清单3-2所示。

  2. 我对使用"同步"感到困惑。在您的方法名称中。如果您在后台线程上执行某些同步操作,那么您不需要执行任何此类runloop操作。只有在后台线程上执行异步任务时才需要这样做,即使这样,通常也有更好的方法。

  3. 也许您可以解释一下您尝试使用代码示例解决的问题,我们可以提供更多帮助。

    有关其他见解,请参阅Rob Mayoff's answer

答案 1 :(得分:1)

以下是Apple API docs对此方法的说法:

  

如果没有输入源或定时器附加到运行循环,则此方法立即退出并返回false

这就是为什么它不等待。不知道你想在这里实现什么。但是,如果你想做这样的等待,我建议使用其他方法,如dispatch_semaphore