2013-04-07 47 views

回答

13

stop標誌用於這樣的:

[coll enumerateUsingBlock:^(id o, NSUInteger i, BOOL *stop) { 
     if (... check for stop ...) { 
      *stop = YES; 
      return; 
     } 
}]; 

當枚舉塊返回時,收集檢查*stop。如果是YES,則停止枚舉。

它以這種方式實現,而不是返回值,因爲這允許併發枚舉而不檢查塊的返回值(這會引起開銷)。即在併發枚舉中,可以同時收集任意數量的迭代並定期檢查*stop。每當*stop轉換爲YES時,它會停止調度更多塊(這也是爲什麼stop標誌不是硬停止的原因;某些未指定的迭代次數可能仍在運行)。

在你的迭代器,你可以這樣做:

BOOL stop = NO; 
for(...) { 
    enumerationBlock(someObj, someIndex, &stop); 
    if (stop) break; 
} 
+0

謝謝,這個完美的作品。這個問題的解決方案也可以在這裏找到:http://www.informit.com/blogs/blog.aspx?uk=Ask-Big-Nerd-Ranch-Blocks-in-ObjectiveC – 2013-04-08 04:23:49

6

下面的代碼定義了需要一個塊作爲參數的方法,並保持運行,直到shouldStop由塊設置爲NO

- (void)myMethod:(void(^)(BOOL *stop))aBlock { 
    BOOL shouldStop = NO; 
    while (!shouldStop) { 
     aBlock(&shouldStop); 
    } 
} 

解釋相當簡單。塊是一個需要一些參數的函數。在這種情況下,我們將一個指針傳遞給我們擁有的BOOL變量。通過這樣做,我們允許塊設置該變量,並且在這種情況下指示循環應該停止。

在這一點上,該塊通過可以做類似

[self myMethod:^(BOOL *stop) { 
     if (arc4random_uniform(1)) { 
      *stop = YES; 
     } 
}];