簡體   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