0

我有以下方法:

-(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 或其他辅助方法的情况下实现这一点?

4

2 回答 2

1

如果你想让一个线程等待一个事件——消息、计时器或其他什么,一个非常好的方法是使用并发 NSOperation。这些对象在单独的线程上运行,但有一个 runLoop,因此它们可以在 runloop 回调中以“正常”方式阻塞,等待某些事情发生。

也就是说,这些确实需要一些技巧才能开始工作。我在 gthub 上有一个演示项目,可以让您探索并发的 NSOperations(还有其他的)。

另一种阻塞直到某事完成(在线程上)的好方法是使用“dispatch_wait()”,它等待所有已排队属于一个组的块。这种技术很容易掌握——你创建一个调度组并使用标准队列或创建你自己的队列,然后使用 dispatch_group 函数对块进行队列。全部排队后,您就可以 dispatch_wait(forever) 等待块完成。

于 2012-08-12T12:43:30.340 回答
0

如果你只是做一个简单的例程,你不需要经常调用这个方法,你为什么不使用一个while语句呢?

while (self.status != kDesiredStatus);

do {TheMagicDispatch}

succesBlock;
于 2012-08-11T10:25:50.033 回答