繁体   English   中英

等待值更改,然后执行一个块

[英]Wait for a value to change and then perform a block

我有以下方法:

-(void) waitForStatusChangeAndPerformBlock:(MyBlockType)successBlock;

这是该方法应执行的操作:

  1. 检查某些status是否具有正确的值
  2. 如果确实调用了块successBlock
  3. 如果不是,则等待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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM