首页 > 其他分享 >iOS开发之使用block块进行数据遍历的方法

iOS开发之使用block块进行数据遍历的方法

时间:2022-11-28 17:06:54浏览次数:37  
标签:遍历 obj Nonnull iOS stop block 字典


看了一篇文章,发现遍历数组、字典中的数据时,除了使用for循环外,还可以使用block块进行操作,瞬间感觉iOS的语言代码确实有点高大上的感觉,下面就简单的介绍一下这个方法。

首先是最基本的运用形式,

//基于 块(block) 结构的遍历数组方法  enumerate:列举,数
    //参数介绍: obj:值  idx:索引  stop:停止遍历
    NSArray *arr1 = @[@"好", @"好", @"学", @"习", @"天", @"天", @"向",@"上"];
    [arr1 enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        //NSLog(@"输出基于 块(block) 结构的遍历数组方法数组中的值.......%@", obj);
        if ([obj isEqualToString:@"习"]) {
            *stop = YES;
        }
    }];
    
    
    //基于 块(block) 结构的遍历字典方法,字典是无序的,每次值的顺序是不固定的  enumerate:列举,数
    //参数介绍: key:键  obj:值  stop:停止遍历
    NSDictionary *dict1 = @{@"1":@"好好", @"2":@"学习", @"3":@"天天",@"4":@"向上"};
    [dict1 enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
        //NSLog(@"输出基于 块(block) 结构的遍历字典方法字典中的值........%@", obj);
        if ([obj isEqualToString:@"向上"]) {
            *stop = YES;
        }
    }];

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

如代码,直接把key和value的类型修改成NSString类型。

//基于 块(block) 结构的遍历字典,如果知道字典中的键、值类型,可以修改块儿中的键、值类型的方法,字典是无序的,每次值的顺序是不固定的  enumerate:列举,数
    //参数介绍: key:键  obj:值  stop:停止遍历
    NSDictionary *dict2 = @{@"1":@"好好", @"2":@"学习", @"3":@"天天",@"4":@"向上"};
    [dict2 enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSString *obj, BOOL * _Nonnull stop) {
        //NSLog(@"基于 块(block) 结构的遍历字典,修改键、值类型的方法字典中的值........%@", obj);
        if ([obj isEqualToString:@"向上"]) {
            *stop = YES;
        }
    }];

//基于 块(block) 结构的 反向 遍历数组方法  enumerate:列举,数   多添加一个参数:NSEnumerationReverse:Reverse:相反,
    //参数介绍: obj:值  idx:索引  stop:停止遍历
    NSArray *arr2 = @[@"好", @"好", @"学", @"习", @"天", @"天", @"向",@"上"];
    [arr2 enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(NSString *obj, NSUInteger idx, BOOL * _Nonnull stop) {
        //NSLog(@"基于 块(block) 结构的 反向 遍历数组方法数组中的值.......%@", obj);
        if ([obj isEqualToString:@"习"]) {
            *stop = YES;
        }
    }];

//基于 块(block) 结构的 并发 遍历数组方法  enumerate:列举,数  Concurrent:同时发生的
    //参数是:NSEnumerationConcurrent,也就是可以同时遍历collection中的几个元素,具体数量根据系统资源而定
    //参数介绍: obj:值  idx:索引  stop:停止遍历
    NSArray *arr3 = @[@"好", @"好", @"学", @"习", @"天", @"天", @"向",@"上"];
    NSMutableArray *newArr = [NSMutableArray arrayWithArray:arr3];
    [newArr enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(NSString *obj, NSUInteger idx, BOOL * _Nonnull stop) {
        obj = [NSString stringWithFormat:@"_%@", obj];
        [newArr replaceObjectAtIndex:idx withObject:obj];
        NSLog(@"基于 块(block) 结构的 并发 遍历数组方法数组中的值.......%@", obj);
//        if ([obj isEqualToString:@"_向"]) {
//            *stop = YES;
//        }
    }];

优缺点总结:

优点:

1、可以完美实现for循环的所有功能;

2、可以方便获取集合中的每一项元素;

3、提供了循环遍历的参数,NSEnumerationReverse用来实现倒序循环。NSEnumerationConcurrent用来实现并发遍历,两个参数可以同时使用;

4、这种循环方式效率高,能够提升程序性能,开发者可以专注于业务逻辑,而不必担心内存和线程的问题;

5、当开启NSEnumerationConcurrent选项时,可以实现for循环和快速遍历无法轻易实现的并发循环功能,系统底层会通过GCD处理并发事宜,这样可以充分利用系统和硬件资源,达到最优的遍历效果;

6、可以修改块签名,当我们已经明确集合中的元素类型时,可以把默认的签名id类型修改成已知类型,比如常见的NSString,这样既可以节省系统资源开销,也可以防止误向对象发送不存在的方法是引起的崩溃。

缺点:

1、很多开发者不知道这种遍历方式;

2、这里使用了block,需要注意在block里容易引起的保留环问题,比如使用self调用方法时,把self转化成若引用即可打破保留环。如:__weak __typeof(self)weakSelf = self 或者 __weak MyController *weakSelf = self; 在block里使用weakSelf即可。

注意:

使用基于块的遍历时是可以修改遍历的元素的,不会导致崩溃,但是如果要删除遍历的元素会导致后面的元素无法遍历而崩溃,解决办法有2种,1、一种是复制一份原集合的副本,对副本进行操作,找出所要操作的元素后再处理原集合;2、使用反向遍历,反向遍历删除元素后不会导致崩溃。


标签:遍历,obj,Nonnull,iOS,stop,block,字典
From: https://blog.51cto.com/u_15894905/5892244

相关文章

  • iOS开发之自定义ActionSheet视图
    有时我们需要用到actionSheet来展示,但是但是往往系统的界面显示很丑或者并不符合UI的要求,所以在这里自定义一个,方便以后使用,后续有时间写一下Swift的开发。自定义ActionShee......
  • iOS模仿京东商城中的选择地区样式
    在ViewController文件中创建添加地址界面:@property(nonatomic,strong)UILabel*selectAreaLabel;//地区显示@property(nonatomic,strong)UITextField*nameTextF;//收货人......
  • IOS中的数据存储方式,特点,使用情况
    数据存储的核心都是写文件,主要有四种持久化方式:属性列表(Plist),对象序列化,SQLite数据库,CoreData。存储Plist:     键值进行存储,不能存储对象。对象需要序列化编码才能......
  • iOS开发之样式多样好用的滑动视图Demo
    现在App基本上都有滑动式图的展示,尤其是新闻资讯类的用到的最多,今天就给大家展示一个多样的滑动视图样式;首先可以看到,这是几种不同的搭配模式,也可以根据style进行其他样式的......
  • iOS开发之可双向调节的Slider滑块
    滑块在很多地方都有使用,所以这里向大家展示一个自定义的可双向控制的Slider,并且可以通过代理方法获取相应的范围值,部分代码如下:属性值:/** 设置最小值 */@property(nonato......
  • iOS开发之最近的小知识点总结一
    1、NSInteger打印以及字符串的转换2、UIScrollView在iOS7中使用了Autolayout导致不能滚动3、APP包瘦身4、interactivepopgesturerecognizer使用5、UICollectionView的数......
  • iOS开发之模仿语音聊天时,显示的音量图
    因为项目中有涉及到语音的内容,所以在这里实现一下说话时语音的音量图的展示具体内容查看代码,有注释语音内容的工具类:staticidinstance;#pragmamark-单例+(instancetyp......
  • iOS开发之最近小知识总结二
    有好多都是基础知识,仅供参考,谢谢1、autolayout自动布局autoLayout需要在​​-(void)viewDidLoad​​​方法执行完后生效,所以需要在​​-(void)viewDidAppear:(BOOL)ani......
  • 关于Block的使用和5点注意事项
    一、概念首先需要了解的是Block是一个代码块,是一个变量的形式存在的。二、构成了解我们需要在函数中声明block,因为是变量的形式,而且存在静态变量形式类型1: NSString......
  • iOS开发之字数不一的多标签Demo
    有朋友让帮他写一个封装的字数不一的多标签视图,所以今天将代码展示一下,供大家学习代码中封装了两种方法,分别是:1.传递数组,数组中是NSString类型的方法;2.传递数组,数组中是NSDi......