[英]Wait for a value to change and then perform a block
我有以下方法:
-(void) waitForStatusChangeAndPerformBlock:(MyBlockType)successBlock;
這是該方法應執行的操作:
status
是否具有正確的值 successBlock
塊 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.