在开发的过程中,我们经常对数组,字典,以及一些其他的集合进行遍历,ios也给我们提供各种各样的遍历方式,现在我就简单列几种遍历方式
/**
* 使用 NSEnumerator 遍历
*/
- (void)test1
{
NSArray *arrayM = @[@"A",@"B",@"C",@"D",@"E"];
NSEnumerator *arrayEmt = [arrayM objectEnumerator];
NSString *obj;
while ((obj = [arrayEmt nextObject]) != nil) {
NSLog(@"obj-----%@-----",obj);
}
NSSet *setM = [[NSSet alloc] initWithObjects:@"one",@"two",@"three",@"four", nil];
NSEnumerator *setEmt = [setM objectEnumerator];
NSString *setObj;
while ((setObj = [setEmt nextObject]) != nil) {
NSLog(@"setObj------%@------",setObj);
}
// 反向遍历
NSArray *arrayM1 = @[@"1",@"2",@"3",@"4",@"5"];
NSEnumerator *am = [arrayM1 reverseObjectEnumerator];
NSString *obj1;
while ((obj1 = [am nextObject])!=nil) {
NSLog(@"obj1------%@------",obj1);
}
}
/**
* 基于BLock的遍历方法
*/
- (void)block
{
NSArray *am = @[@"A",@"B",@"C",@"D",@"E"];
[am enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"all-----%@------",obj);
if ([obj isEqualToString:@"3"]) {
*stop = YES;
}
}];
// 反向编译
[am enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"-------%@-----",obj);
}];
}
/**
* 使用GCD的dispatch_apply函数,一般用于处理耗时较长,迭代次数较多的情况
*/
- (void)GCD
{
NSArray *am = @[@"1",@"2",@"3",@"4",@"5"];
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
dispatch_apply(am.count, queue, ^(size_t index) {
NSLog(@"-------%@-----%@",am[index],[NSThread currentThread]);
});
}
以上几种遍历方式,各自都有优缺点,大家在开发的过程中,根据需求择优选择,希望对大家有所帮助。