我想在我的課堂上製作一個方法,例如NSDictionary
類的enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop)
。如何使用像NSDictionary類中的enumerateObjectsUsingBlock這樣的塊的停止條件?
我對塊的使用有一點了解,但我一直無法弄清楚如何使enumerateObjectsUsingBlock
函數使用的停止條件。有什麼建議麼?
我想在我的課堂上製作一個方法,例如NSDictionary
類的enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop)
。如何使用像NSDictionary類中的enumerateObjectsUsingBlock這樣的塊的停止條件?
我對塊的使用有一點了解,但我一直無法弄清楚如何使enumerateObjectsUsingBlock
函數使用的停止條件。有什麼建議麼?
的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;
}
下面的代碼定義了需要一個塊作爲參數的方法,並保持運行,直到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;
}
}];
謝謝,這個完美的作品。這個問題的解決方案也可以在這裏找到:http://www.informit.com/blogs/blog.aspx?uk=Ask-Big-Nerd-Ranch-Blocks-in-ObjectiveC – 2013-04-08 04:23:49