IOS 任务执行顺序

关于dispatch_group的概念以及几种场景下的使用:

1、调用接口的时候,一个vc下要调用多个接口的情况下,而且这写接口成功回调顺序需要严格控制。目前的解决方式通常是在第一个接口成功的回调里边调起第二个接口,这种方式不能说不行,但是某些时候可能也会存在无法控制不能实现业务逻辑。但是通过dispatch_group就可以很好的控制并实现这一目的。

2、现在有4个任务,任务1、任务2、任务3、任务4. 任务3必须在任务2之后,任务4必须在前3个任务都执行完成后,才能执行,并且需要在主线程更新UI。 任务3必须在任务2之后,所以这两个必须串行执行,同时,任务2和3整体可以和任务1并行执行,最后,任务4只能等待前3个任务全部执行完成,才能执行。这里就可以用group快速实现场景需求

关于dispatch_group

把一组任务提交到队列中,这些队列可以不相关,然后监听这组任务完成的事件。 
最常见的几个方法:

1、dispatch_group_create创建一个调度任务组

2、dispatch_group_async 把一个任务异步提交到任务组里

3、dispatch_group_enter/dispatch_group_leave 这种方式用在不使用dispatch_group_async来提交任务,且必须配合使用

4、dispatch_group_notify 用来监听任务组事件的执行完毕

5、dispatch_group_wait 设置等待时间,在等待时间结束后,如果还没有执行完任务组,则返回。返回0代表执行成功,非0则执行失败

针对场景2可以使用下边的方式实现:

 任务3必须在任务2之后,所以这两个必须串行执行,同时,任务2和3整体可以和任务1并行执行,最后,任务4只能等待前3个任务全部执行完成,才能执行。

-(void)disGroup{
    dispatch_queue_t globalQuene = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); // 全局并发队列
    dispatch_queue_t selfQuene = dispatch_queue_create("myQuene", 0); // 串行队列
    dispatch_group_t group = dispatch_group_create();
    dispatch_group_async(group, globalQuene, ^{
        NSLog(@"run task 1");
    });
    dispatch_group_async(group, selfQuene, ^{
        NSLog(@"run task 2");
    });
    dispatch_group_async(group, selfQuene, ^{
        NSLog(@"run task 3");
    });
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        NSLog(@"run task 4");
    });
}

总结: 1和(2、3)是并行执行关系,2、3是串行执行关系,且3肯定在2之后,而4在(1、2、3)全部完成之后才会执行。

 

 

假如:有3个异步请求任务,任务1、2、3,在3个任务全部完成之后,需要执行任务4,用以显示界面数据。

实现方式:

-(void)disGroupEnterAndLeave{
    dispatch_queue_t globalQuene = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_group_t group = dispatch_group_create();

    //任务1
    dispatch_group_enter(group);
    dispatch_async(globalQuene, ^{
         NSLog(@"run task 1");
        sleep(1);
        dispatch_group_leave(group);
    });

    //任务2
    dispatch_group_enter(group);
    dispatch_async(globalQuene, ^{
        NSLog(@"run task 2");
        sleep(2);
        dispatch_group_leave(group);
    });

    //任务3
    dispatch_group_enter(group);
    dispatch_async(globalQuene, ^{
        NSLog(@"run task 3");
        sleep(3);
        dispatch_group_leave(group);
    });

    //一直等待完成
    dispatch_group_wait(group, DISPATCH_TIME_FOREVER);

    //任务3
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        NSLog(@"run task 4");
    });

}

执行结果: 
3个任务是并行执行,且一共花费3s执行,然后才执行任务4。

当然,如果这样想串行执行3个任务,只需要把 全局队列 换成 自定义队列 即可。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 不同手机执行顺序不一样可能是因为: 1. 不同手机的操作系统版本不同,可能存在一些差异。 2. 不同手机使用的处理器不同,处理器的架构和性能也不同,可能会影响代码的执行速度和顺序。 3. 不同手机的内存大小不同,内存的使用情况也不同,可能会导致程序的执行顺序不同。 4. 不同手机的软件环境和应用程序也不同,可能会影响程序的执行顺序。 因此,在编写移动应用程序时,需要考虑不同手机的差异性,进行适当的测试和调整。 ### 回答2: 不同手机执行顺序不一样的原因主要有两个方面。 首先,不同手机使用的操作系统和处理器架构不尽相同。操作系统是手机执行任务的核心,例如Android、iOS等。不同的操作系统有不同的执行逻辑和任务管理机制,导致任务执行顺序可能会有所不同。此外,手机的处理器架构也会对任务执行顺序产生影响。不同处理器架构的电路设计和指令集可能存在差异,导致任务执行顺序在硬件层面也会有所区别。 其次,不同手机的硬件配置和资源管理策略也会影响任务执行顺序。手机的硬件配置包括处理器性能、内存容量等,不同配置的手机在执行任务时的速度和能力会有所差异,从而影响执行顺序。此外,手机的资源管理策略也会影响任务执行顺序。例如,一些手机可能更倾向于优先处理前台应用程序的任务,而对后台应用的任务进行延迟,从而导致执行顺序的不同。 综上所述,不同手机执行顺序不一样是由于操作系统和处理器架构的差异以及硬件配置和资源管理策略的影响。这种差异是根据不同的设计和策略,以提供更好的用户体验和资源利用效率。 ### 回答3: 不同手机执行顺序不一样的原因主要有以下几点。 首先是硬件配置的不同。不同手机的硬件配置包括处理器、内存、存储等方面的差异,这些配置差异会影响手机的运行速度和执行顺序。处理器的性能越高,执行指令的速度就越快,手机的响应速度也会更快。而内存的大小会影响手机同时运行多个应用程序时的效率,存储空间的大小则会影响应用程序的加载速度等。 其次是操作系统的差异。不同手机使用的操作系统可能来自不同的开发商或版本,操作系统的优化程度和执行策略会有所不同,从而导致执行顺序的差异。例如,某些操作系统可能采用了更高效的任务调度算法,使得手机的多任务处理更加流畅。而另一些操作系统可能在界面显示上更快,但在后台任务执行顺序上可能略有不同。 此外,应用程序本身的设计和编码也可能导致不同手机执行顺序的差异。一些应用程序可能采用了异步执行的方式,即在后台执行一些任务,这样就可以提高界面的响应速度。而另一些应用程序可能更倾向于顺序执行,致使界面在某些情况下会有一定的卡顿。应用程序的功能和复杂度也会影响执行顺序,一些功能较为简单的应用程序执行顺序可能更一致,而功能较为复杂的应用程序可能会有更多的情况导致执行顺序的差异。 总之,不同手机执行顺序不一样主要是由硬件配置、操作系统和应用程序本身的设计等多个因素共同影响的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值