我希望在我的类中创建一个方法,类似于NSDictionary
类的enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop)
方法。
我对块的使用有一些了解,但我无法弄清如何创建enumerateObjectsUsingBlock
函数使用的停止条件。 有什么建议吗?
我希望在我的类中创建一个方法,类似于NSDictionary
类的enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop)
方法。
我对块的使用有一些了解,但我无法弄清如何创建enumerateObjectsUsingBlock
函数使用的停止条件。 有什么建议吗?
使用stop
标志的方式如下:
[coll enumerateUsingBlock:^(id o, NSUInteger i, BOOL *stop) { if (... check for stop ... ) { *stop = YES; return; } }];
当枚举块返回时,集合会检查*stop
。如果它为YES
,则停止枚举。dispatch_async()
任意数量的同时迭代,并定期检查*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; }}];