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

最佳答案

一些观察:

  • 为了使运行循环保持 Activity 状态,您已向其添加了一个源。例如,您可以执行以下操作:
    [[NSRunLoop currentRunLoop] addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode];
    

    不幸的是,这将使runMode无法完成,直到将端口从运行循环中删除为止。因此,在设置operationComplete时,您要么必须删除此源。或不要使用这种runMode方法(例如,使用Threading Programming Guide: Run Loops list 3-2中所示的CFRunLoopRunInMode Core Foundation函数)。
  • 我对您的方法名称中使用“同步”感到困惑。如果您正在后台线程上执行同步操作,则无需执行任何此类运行循环操作。仅在后台线程上执行异步任务时才需要这样做,即使那样,通常也有更好的方法。

  • 也许您可以用代码示例解释您要解决的问题,我们可以为您提供更多帮助。

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

    关于ios - NSRunLoop runMode :beforeDate: doesn't wait,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35123220/

    10-10 12:31