Objective-C中的非阻塞等待函数

时间:2009-07-17 17:55:36

标签: objective-c

我是Objective-C的新手,我无法弄清楚如何以非阻塞的方式等待。我有一个异步填充的对象,我需要等待它才能继续进行另一种方法。现在我正在使用sleep函数,但这会阻止整个app,myObject永远不会被加载。

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

编辑:此代码段来自可能在加载myObject之前调用的方法。在这种情况下,我实际上想要阻止此方法,但我的代码会阻止包括myObject在内的所有内容。

6 个答案:

答案 0 :(得分:7)

这个小桃子为我工作(为了延迟20秒)......

CFRunLoopRunInMode(kCFRunLoopDefaultMode, 20.0, false);

答案 1 :(得分:6)

如果可以,请在加载相关对象时为类调用myObjectLoaded:方法。否则,上面写的最常用的等价物就是创建一个定时器,它不断检查myObject并在找到它后做一些事情。

如果由于某种原因你真的需要在方法的中间进行,你必须创建一个循环来继续运行runloop。缺少一个导致你的应用程序阻止的runloop。

答案 2 :(得分:3)

NSNotification应解决问题。

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

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

答案 3 :(得分:0)

听起来你正在寻找观察者模式。 Apple称之为“notification”。

答案 4 :(得分:0)

假设您有一些背景NSThread执行此填充操作,您可能会喜欢NSObject方法performSelector:onThread:withObject:waitUntilDone

答案 5 :(得分:0)

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

如果你希望主线程在加载对象时做某事,那么创建一个方法myObjectLoaded:并从你的加载线程调用:

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

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