我是Objective-C的新手,我无法弄清楚如何以非阻塞的方式等待。我有一个异步填充的对象,我需要等待它才能继续进行另一种方法。现在我正在使用sleep函数,但这会阻止整个app,myObject永远不会被加载。
while (!myObject)
{
sleep(1);
}
return myObject;
编辑:此代码段来自可能在加载myObject之前调用的方法。在这种情况下,我实际上想要阻止此方法,但我的代码会阻止包括myObject在内的所有内容。
答案 0 :(得分:7)
这个小桃子为我工作(为了延迟20秒)......
CFRunLoopRunInMode(kCFRunLoopDefaultMode, 20.0, false);
答案 1 :(得分:6)
如果可以,请在加载相关对象时为类调用myObjectLoaded:
方法。否则,上面写的最常用的等价物就是创建一个定时器,它不断检查myObject并在找到它后做一些事情。
如果由于某种原因你真的需要在方法的中间进行,你必须创建一个循环来继续运行runloop。缺少一个导致你的应用程序阻止的runloop。
答案 2 :(得分:3)
NSNotification应解决问题。
不要等待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本身。