我有以下方法:
-(void) waitForStatusChangeAndPerformBlock:(MyBlockType)successBlock;
这是该方法应该执行的操作:
- 检查某些
状态
是否具有正确的值 - 如果它确实调用了 block
successBlock
- 如果不等待
status
更改为给定值,然后调用 blocksuccessBlock
我考虑使用 KVO 来检查值是否已更改,但随后我必须将 block 存储在某个实例变量中,或者更糟糕的是,存储在数组中,并且我会丢失当前方法调用的上下文。所以我真正想要的是这样的:
-(void) waitForStatusChangeAndPerformBlock:(MyBlockType)successBlock{
if(self.status == kDesiredStatus){
successBlock;
} else {
[TheMagicDispatchWaitUntil:(self.status == kDesiredStatus) andThenDoThis:^{
successBlock;
}];
}
}
有没有一种方法可以在不使用 KVO 或其他辅助方法的情况下实现此目的?
最佳答案
如果你想让 theead 等待一个事件 - 消息、计时器或其他什么,一个非常好的方法是使用 Concurrent NSOperation。这些对象在单独的线程上运行,但具有 runLoop,因此它们可以在 runloop 回调中以“正常”方式阻塞,等待某些事情发生。
也就是说,这些确实需要一些技巧才能发挥作用。我有一个demo project在 gthub 上,您可以探索并发 NSOperations(还有其他操作)。
另一种阻塞直到某件事完成(在线程上)的好方法是使用“dispatch_wait()”,它等待属于一个组的所有已排队的 block 。这种技术非常容易掌握 - 您创建一个调度组并使用标准队列或创建您自己的队列,然后使用dispatch_group函数对 block 进行队列。一旦所有内容都排队,您就可以使用dispatch_wait(forever)来等待 block 完成。
关于iphone - 等待值改变然后执行 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11913761/