[英]Wait for a value to change and then perform a block
我有以下方法:
-(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或其他辅助方法,有没有办法实现这一目标?
如果您希望theead等待事件(消息,计时器或其他任何事件),那么一种非常不错的方法是使用Concurrent NSOperation。 这些对象在单独的线程上运行,但是具有runLoop,因此它们可以在runloop回调中以“常规”方式阻塞,以等待发生某些事情。
就是说,这些确实需要一些技巧才能开始工作。 我在gthub上有一个演示项目 ,可让您探索并发的NSOperation(还有其他)。
阻塞(在线程上完成某事)之前,阻塞的另一种好方法是使用“ dispatch_wait()”,它等待已排队的属于某个组的所有块。 这项技术非常容易使用-您创建一个调度组并使用标准队列或创建自己的队列,然后使用dispatch_group函数对块进行排队。 所有队列都排队后,您就可以dispatch_wait(forever)来完成块。
如果您只是执行一个简单的例程,而不必经常调用此方法,那么为什么不只使用while语句呢?
while (self.status != kDesiredStatus);
do {TheMagicDispatch}
succesBlock;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.