objective-c - NSArray enmuerateUsingBlock,一个在另一个里面,如何停止外部枚举?

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

我使用一个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);
        }];
    }];
}

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

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

最佳答案

这应该有效:

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

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

关于objective-c - NSArray enmuerateUsingBlock,一个在另一个里面,如何停止外部枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11835686/

相关文章:

ios - 如何保存NSMutableArray来解析?

ios - 构造具有唯一中心的 UIView 对象的 NSArray

iphone - 尝试删除 TableView 部分时的 EXC_BAD_ACCESS

ios - videoMaximumDuration 不限制持续时间

cocoa - 空选择器发送到 NSMutableArray 中的第一项

ios - 从 iOS 中的选择查询填充数组

iphone - 在主页按钮上捕获关闭事件 UIImagePickerController

ios - 在 iOS 中使用 UIImagePickerController 时,如何检测用户是否从库中选择图片或视频?

ios - 尝试使用 JSONModel : Invalid type in JSON write (. 序列化后出错 ..)

ios - 无法使用sharedStore传递带有内容的数组?