【问题标题】:NSArray enmuerateUsingBlock, one inside another, how to stop the outer enumeration?NSArray enmuerateUsingBlock,一内一,如何停止外枚举?
【发布时间】:2012-08-03 20:40:06
【问题描述】:

我使用一个nsmutablearray创建了一个二维数组,有一个方法:

- (void)enumerateObjectsUsingBlock:(void (^)(id obj, NSUInteger row, NSUInteger column, BOOL *stop))block
{
    [self.internalArray enumerateObjectsUsingBlock:^(id obj, NSUInteger rowIdx, BOOL *stopRow){
        NSMutableArray *rowArray = obj;
        [rowArray enumerateObjectsUsingBlock:^(id obj, NSUInteger columnIdx, BOOL *stopColumn){
            block(obj, rowIdx, columnIdx, stopColumn);
        }];
    }];
}

我注意到如果“块”将 stopColumn 设置为 YES,那么我需要一种方法来通知外部块 stopRow 也应该为 YES,我不确定是否可以:

  1. 只使用一个 BOOL *stop 而不是 stopRow 和 stopColumn(因为我使用的是 ARC),或者
  2. 在外层块内添加BOOL isStop,内层块可以设置为stopColumn吗?

【问题讨论】:

    标签: objective-c nsmutablearray nsarray objective-c-blocks enumeration


    【解决方案1】:

    这应该可行:

    - (void)enumerateObjectsUsingBlock:(void (^)(id obj, NSUInteger row, NSUInteger column, BOOL *stop))block
    {
        [self.internalArray enumerateObjectsUsingBlock:^(id obj, NSUInteger rowIdx, BOOL *stopRow){
            NSMutableArray *rowArray = obj;
            [rowArray enumerateObjectsUsingBlock:^(id obj, NSUInteger columnIdx, BOOL *stopColumn) {
                block(obj, rowIdx, columnIdx, stopColumn);
                // Add this line:
                *stopRow = *stopColumn;
            }];
        }];
    }
    

    一个块应该捕获其主体使用的所有变量,包括stopRow 指针。由于您没有修改指针本身,只修改它指向的数据,因此您不需要做任何其他事情(如果您需要修改指针本身,您需要一个声明为__block 的附加临时变量)。

    【讨论】:

      猜你喜欢
      • 2016-11-12
      • 1970-01-01
      • 2010-09-11
      • 2012-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多