如何在NSDictionary类的enumerateObjectsUsingBlock块中使用停止条件?

7

我希望在我的类中创建一个方法,类似于NSDictionary类的enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop)方法。

我对块的使用有一些了解,但我无法弄清如何创建enumerateObjectsUsingBlock函数使用的停止条件。 有什么建议吗?

2个回答

14

使用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;
 }

谢谢,这个完美地解决了问题。这个问题的解决方案也可以在这里找到:http://www.informit.com/blogs/blog.aspx?uk=Ask-Big-Nerd-Ranch-Blocks-in-Objective-C - Alejandro Cotilla

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;      }}];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接