2013-04-07 41 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; 
     } 
}];