NSArray enmuerateUsingBlock,一个在另一个里面,如何停止外部枚举?
问题描述:
我创建使用一个NSMutableArray的二维阵列,并且有一种方法:NSArray enmuerateUsingBlock,一个在另一个里面,如何停止外部枚举?
- (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应该是为好,我不知道如果我能:
- 只使用一个BOOL *停止,而不是stopRow和stopColumn(因为我使用ARC),或
- 添加BOOL ISSTOP内部外块和内部块可以将其设置为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;
}];
}];
}
块应该捕获所有的变量,它的机身采用,包括stopRow
指针。既然你不修改指针本身,只有它指向的数据,你不需要做任何事情(如果你需要修改指针本身,你需要一个额外的临时变量,声明为__block
)。