等待值更改然后执行块

时间:2012-08-11 10:09:05

标签: iphone objective-c ios cocoa-touch objective-c-blocks

我有以下方法:

-(void) waitForStatusChangeAndPerformBlock:(MyBlockType)successBlock;

这是方法应该做的:

  1. 检查某些status是否具有正确的值
  2. 如果确实调用了阻止successBlock
  3. 如果不等待status更改为给定值,然后调用块successBlock
  4. 我考虑过KVO来检查值是否已经改变,但是我必须将块存储在某个实例变量中,或者更糟糕的是,数组,我会松开当前方法调用的上下文。所以我真正想要的是这样的:

    -(void) waitForStatusChangeAndPerformBlock:(MyBlockType)successBlock{
      if(self.status == kDesiredStatus){
        successBlock;
      } else {
    
          [TheMagicDispatchWaitUntil:(self.status == kDesiredStatus) andThenDoThis:^{
             successBlock;
          }];   
       }
    }
    

    有没有办法在没有KVO或其他辅助方法的情况下实现这一目标?

2 个答案:

答案 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;