iOS 基于块的遍历方式

作者: _YZG_ | 来源:发表于2016-11-02 18:01 被阅读65次

    数组

    
    
        
            NSArray *iosArray = @[@"L", @"O", @"V", @"E", @"I", @"O", @"S"];
            
            [iosArray enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
                
                NSLog(@"%@", obj);
                
                if ([obj isEqualToString:@"E"]) {
                    
                    *stop = YES;
                    
                }
                
            }];
    

    若已知collection里对象的数据类型,可以修改块签名,知道对象的精确类型后,编译器就可以检测开发者是否调用了该对象所不具有的方法,并在发现问题时报错。

    字典

    
            
            NSDictionary *dict = @{@"1":@"11", @"2":@"22", @"3":@"33"};
            
            [dict enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
                
                NSLog(@"%@", obj);
                
                if ([obj isEqualToString:@"22"]) {
                    
                    *stop = YES;
                    
                }
                
            }];
    

    反向遍历

            NSArray *iosArray = @[@"L", @"O", @"V", @"E", @"I", @"O", @"S"];
            
            [iosArray enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(NSString *obj, NSUInteger idx, BOOL * _Nonnull stop) {
                
                NSLog(@"%@", obj);
                
                if ([obj isEqualToString:@"E"]) {
                    
                    *stop = YES;
                    
                }
                
            }];
    

    并发遍历

    
            NSArray *iosArray = @[@"L", @"O", @"V", @"E", @"I", @"O", @"S"];
            
            NSMutableArray *iosMutableArray = [NSMutableArray arrayWithArray:iosArray];
            
            [iosMutableArray enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(NSString *obj, NSUInteger idx, BOOL * _Nonnull stop) {
                
                obj = [NSString stringWithFormat:@"_%@", obj];
                
                [iosMutableArray replaceObjectAtIndex:idx withObject:obj];
                
                NSLog(@"%@", obj);
                
                if ([obj isEqualToString:@"_I"]) {
                    
                    *stop = YES;
                    
                }
                
            }];
    

    使用反向遍历,反向遍历删除元素后不会导致崩溃。
    这里使用了block,需要注意在block里容易引起的保留环问题,比如使用self调用方法时,把self转化成若引用即可打破保留环。如:__weak __typeof(self)weakSelf = self或者 __weak MyController *weakSelf = self;在block里使用weakSelf即可。

    相关文章

      网友评论

        本文标题:iOS 基于块的遍历方式

        本文链接:https://www.haomeiwen.com/subject/lbvvuttx.html