typedef NS_OPTIONS(NSUInteger, NSEnumerationOptions) {
NSEnumerationConcurrent = (1UL << 0),并发排序
NSEnumerationReverse = (1UL << 1),逆序
};
// obj 内容
// idx 数组中的位置
// stop 为YES的时候停止遍历
- (void)enumerateObjectsWithOptions:(NSEnumerationOptions)opts usingBlock:(void (NS_NOESCAPE ^)(ObjectType obj, NSUInteger idx, BOOL *stop))block NS_AVAILABLE(10_6, 4_0);
NSMutableArray *mutArr = [[NSMutableArray alloc]initWithArray:@[
@"a",
@"b",
@"c",
@"d",
@"e",
@"f",
@"g"
]];
[mutArr enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"obj:%@,idx:%lu",obj,(unsigned long)idx);
[mutArr insertObject:@"h" atIndex:0];
if (idx == 2) {
*stop = YES;
NSLog(@"%@",mutArr);
}
}];
2017-04-11 14:03:16.161707 Test2[4386:1449433] obj:g,idx:6
2017-04-11 14:03:17.853742 Test2[4386:1449433] obj:e,idx:5
2017-04-11 14:03:17.853903 Test2[4386:1449433] obj:c,idx:4
2017-04-11 14:03:17.853979 Test2[4386:1449433] obj:a,idx:3
2017-04-11 14:03:17.854048 Test2[4386:1449433] obj:h,idx:2
2017-04-11 14:03:17.854414 Test2[4386:1449433] (
h,
h,
h,
h,
h,
a,
b,
c,
d,
e,
f,
g
)
这种数组遍历方式的优势:
- 遍历顺序有倒序/并发混序, 可根据枚举值控制比 for循环方便许多.
- 遍历中自带 *stop参数, 跳出方便.
- 可以在遍历的 block中增删数据, 比 forin遍历方便许多
- 在庞大的数据量下, 此方式是比 for循环, forin 等方式,要快许多的方式.在其执行过程中可以利用到多核cpu的优势