我有以下方法:
-(void) waitForStatusChangeAndPerformBlock:(MyBlockType)successBlock;
这是方法应该做的:
status
是否具有正确的值successBlock
status
更改为给定值,然后调用块successBlock
我考虑过KVO来检查值是否已经改变,但是我必须将块存储在某个实例变量中,或者更糟糕的是,数组,我会松开当前方法调用的上下文。所以我真正想要的是这样的:
-(void) waitForStatusChangeAndPerformBlock:(MyBlockType)successBlock{
if(self.status == kDesiredStatus){
successBlock;
} else {
[TheMagicDispatchWaitUntil:(self.status == kDesiredStatus) andThenDoThis:^{
successBlock;
}];
}
}
有没有办法在没有KVO或其他辅助方法的情况下实现这一目标?
答案 0 :(得分:1)
如果你想要一个theead等待事件 - 消息,计时器或其他什么,一个非常好的方法是使用并发NSOperation。这些对象在一个单独的线程上运行,但是有一个runLoop,因此它们可以在runloop回调中以“正常”的方式阻塞,等待发生的事情。
尽管如此,这些确实需要一些技巧才能开始工作。我在gthub上有一个demo project,可以让你探索并发的NSOperations(还有其他的)。
另一个阻止直到完成任务的好方法(在线程上)是使用“dispatch_wait()”,它等待已排队的所有块属于一个组。这种技术很容易上手 - 您创建一个调度组并使用标准队列或创建自己的队列,然后使用dispatch_group函数对队列进行排队。一旦所有队列排队,你就可以(永远)dispatch_wait让块完成。
答案 1 :(得分:0)
如果你只是做一个简单的例程,而且你不必经常调用这个方法,为什么不使用while语句?
while (self.status != kDesiredStatus);
do {TheMagicDispatch}
succesBlock;