enumerateObjects遍历方法详解

在之前的文章中转载过iOS中集合遍历方法的比较和技巧, 有兴趣的可以了解一下. 本文主要是介绍enumerateObjects遍历方法.

ios中常用的遍历运算方法

遍历的目的是获取集合中的某个对象或执行某个操作,所以能满足这个条件的方法都可以作为备选:

  • 经典for循环
  • for in (NSFastEnumeration),若不熟悉可以参考《nshipster介绍NSFastEnumeration的文章》
  • makeObjectsPerformSelector
  • kvc集合运算符
  • enumerateObjectsUsingBlock
  • enumerateObjectsWithOptions(NSEnumerationConcurrent)
  • dispatch_apply

enumerateObjects遍历方法

在enumerateObjects遍历有3个方法, 这个遍历方式的优点:
1.遍历顺序有正序/倒序/并发混序三种, 可根据枚举值控制比 for循环方便许多.
2.遍历中自带 *stop参数, 跳出方便.
3.可以在遍历的 block中增删数据, 比 forin遍历方便许多
4.在庞大的数据量下, 此方式是比 for循环, forin 等方式,要快许多的方式.在其执行过程中可以利用到多核cpu的优势

正序遍历方法

    NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"1",@"2",@"3",@"4",@"5", nil];
    
    //按顺序对 arr 进行遍历
    [arr enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        NSLog(@"%ld===%@",idx,obj);
        
        if (idx == 4){
            *stop = YES;
        }
    }];

打印结果:

0===1
1===2
2===3
3===4
4===5

倒序/并发混序遍历方法

option参数:
//NSEnumerationReverse 倒序执行
//NSEnumerationConcurrent 并行发生, 并发混序

    NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"1",@"2",@"3",@"4",@"5", nil];
    
    [arr enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        NSLog(@"%ld===%@",idx,obj);
        if (idx == 3){
	        *stop = YES;
        }
    }];

打印结果:

0===1
4===5
1===2
2===3
3===4

根据indexSet进行倒序/并发混序的遍历方法

(NSIndexSet *)s参数: 需要遍历的下标 set

NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"1",@"2",@"3",@"4",@"5", nil];
    //根据indexSet 中包含的下标, 在 arr 中进行遍历
//    NSIndexSet *indexSet = [NSIndexSet indexSetWithIndex:1];
    NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(2, 2)];
    [arr enumerateObjectsAtIndexes:indexSet options:NSEnumerationReverse usingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        NSLog(@"%ld===%@",idx,obj);
    }];

打印结果:

3===4
2===3

你可能感兴趣的:(enumerateObjects遍历方法详解)