代码之家  ›  专栏  ›  技术社区  ›  Besi

等待值更改,然后执行块

  •  0
  • Besi  · 技术社区  · 13 年前

    我有以下方法:

    -(void) waitForStatusChangeAndPerformBlock:(MyBlockType)successBlock;
    

    这就是该方法应该做的:

    1. 检查是否有 status 具有正确的值
    2. 如果它确实调用了块 successBlock
    3. 如果不等待 地位 更改为给定值,然后调用块 成功阻止

    我考虑过KVO来检查值是否发生了变化,但随后我必须将块存储在某个实例变量中,或者更糟的是,存储在一个数组中,并且我会丢失当前方法调用的上下文。所以我真正想要的是这样的东西:

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

    有没有一种方法可以在没有KVO或其他辅助方法的情况下实现这一点?

    2 回复  |  直到 13 年前
        1
  •  1
  •   David Hoerl    13 年前

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

    也就是说,这些确实需要一些技巧才能发挥作用。我有一个 demo project 在gthub上,您可以探索并发的NSOperations(还有其他操作)。

    另一种很好的阻塞方法是使用“dispatch_wait()”,它等待属于一个组的所有排队的块。这种技术很容易掌握——您可以创建一个调度组并使用标准队列,或者创建自己的队列,然后使用dispatch_group函数对块进行排队。一旦所有的块都排队了,您就可以(永远)等待块完成。

        2
  •  0
  •   Stefan Thuwis    13 年前

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

    while (self.status != kDesiredStatus);
    
    do {TheMagicDispatch}
    
    succesBlock;