OGeek|极客世界-中国程序员成长平台

标题: ios - NSRunLoop 运行模式 :beforeDate: doesn't wait [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-12 10:22
标题: ios - NSRunLoop 运行模式 :beforeDate: doesn't wait

正如标题所说,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-推荐答案


几个观察:

  1. 为了让运行循环保持活跃,你需要添加一个源代码。例如,您可以这样做:

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

    不幸的是,这也将阻止 runMode 完成,直到端口从运行循环中删除。因此,您要么必须在设置 operationComplete 时删除此源。或者不要使用这个 runMode 方法(例如,可能使用 CFRunLoopRunInMode Core Foundation 函数,如 Threading Programming Guide: Run Loops 中的 list 3-2 所示)。

  2. 我对在您的方法名称中使用“同步”感到困惑。如果你在后台线程上做一些同步的事情,那么你不需要做任何这些运行循环的东西。只有在后台线程上执行异步任务时才需要这样做,即使那样,通常也有更好的方法。

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

Rob Mayoff's answer了解其他见解。

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






欢迎光临 OGeek|极客世界-中国程序员成长平台 (http://ogeek.cn/) Powered by Discuz! X3.4