【问题标题】:Non-blocking wait function in Objective-CObjective-C 中的非阻塞等待函数
【发布时间】:2010-11-11 19:14:02
【问题描述】:

我对 Objective-C 还很陌生,我不知道如何以非阻塞方式等待。我有一个正在异步填充的对象,我需要等待它,然后才能继续使用另一种方法。现在我正在使用 sleep 功能,但这会阻止整个应用程序并且 myObject 永远不会被加载。

while (!myObject)
{
    sleep(1);
}
return myObject;

编辑:此代码 sn-p 来自可以在加载 myObject 之前调用的方法。在这种情况下,我确实想阻止这个方法,但是我的代码阻止了包括 myObject 在内的所有内容被加载。

【问题讨论】:

标签: objective-c


【解决方案1】:

这个小桃子对我有用(为了延迟20秒)....

CFRunLoopRunInMode(kCFRunLoopDefaultMode, 20.0, false);

【讨论】:

    【解决方案2】:

    如果可以,请为类提供一个myObjectLoaded: 方法,以便在加载相关对象时调用。否则,与您在上面写的最惯用的等价物是创建一个计时器,该计时器不断检查 myObject 并在找到它后执行某些操作。

    如果您出于某种原因确实需要在方法中间执行此操作,则必须创建一个循环来保持运行循环。导致您的应用程序阻塞的原因是缺少运行循环。

    【讨论】:

      【解决方案3】:

      NSNotification 应该可以解决问题。

      http://developer.apple.com/documentation/Cocoa/Conceptual/Notifications/Introduction/introNotifications.html

      不要等待对象,而是让此对象注册来自您的其他对象(例如发布者)的通知,该对象以异步方式填充数据。这个 Publisher 对象完成后,让它发布一个 NSNotification,然后你的等待对象会自动获取它。这也将消除等待。

      【讨论】:

        【解决方案4】:

        听起来您正在寻找观察者模式。苹果称其为“notification”。

        【讨论】:

        • 不是我想要的。我不想收到通知,我希望在加载 myObject 之前阻塞 this 线程,但我的代码完全阻止加载 myObject。
        【解决方案5】:

        假设你有一些后台 NSThread 执行这​​个填充操作,你可能会喜欢 NSObject 方法performSelector:onThread:withObject:waitUntilDone

        【讨论】:

          【解决方案6】:

          那是因为你正在停止等待你的对象被加载的主线程。不要那样做,因为主线程是驱动 UI 并等待用户输入的线程。如果阻塞主线程,就会阻塞应用程序用户界面。

          如果您希望主线程在加载对象时执行某些操作,则创建一个方法 myObjectLoaded: 并从您的加载线程调用:

          [myObjectController performSelectorOnMainThread:@selector(myObjectLoaded:) 
                                               withObject:myObject 
                                            waitUntilDone:NO];
          

          其中 myObjectController 可以是任何对象,甚至是 myObject 本身。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-09-17
            • 1970-01-01
            • 2015-01-15
            • 1970-01-01
            • 2020-03-29
            • 1970-01-01
            • 2021-12-12
            • 1970-01-01
            相关资源
            最近更新 更多