我想在我的课堂上制作一个方法,例如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