美文网首页iOS取经之路
iOS 前面任务下载完成,执行后续操作。

iOS 前面任务下载完成,执行后续操作。

作者: 上帝很忙 | 来源:发表于2018-09-05 17:38 被阅读64次

1.思路:GCD调度组:dispatch_group

- (void)dispatch_group{
    
    NSArray*moviesArray = [NSArray arrayWithObjects:
                          @"第1集", @"第2集",@"第3集",@"第4集",@"第5集",
                          @"第6集",@"第7集",@"第8集",@"第9集",@"第10集",
                          @"第11集", @"第12集",@"第13集",@"第14集",@"第15集",
                          @"第16集",@"第17集",@"第18集",@"第19集",@"第20集",
                          nil];

    dispatch_group_t group = dispatch_group_create();
    //for循环创建任务,加入到group中
    for (int i = 0; i<moviesArray.count; i++) {
        dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
            NSLog(@"%@开始下载",moviesArray[i]);
            sleep(i+1);//假设后集比前集多耗时1秒,即第一集用时1秒,第二集2秒...
            NSLog(@"%@下载完成",moviesArray[i]);
        });
    }

    //group完成
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        NSLog(@"全部任务下载完成");
    });
    
}

或者

- (void)dispatch_group2{
    
    NSArray*moviesArray = [NSArray arrayWithObjects:
                           @"第1集", @"第2集",@"第3集",@"第4集",@"第5集",
                           @"第6集",@"第7集",@"第8集",@"第9集",@"第10集",
                           @"第11集", @"第12集",@"第13集",@"第14集",@"第15集",
                           @"第16集",@"第17集",@"第18集",@"第19集",@"第20集",
                           nil];
    
    dispatch_group_t group = dispatch_group_create();
    
    for (int i = 0; i<moviesArray.count; i++) {
        
        dispatch_group_enter(group);//进入
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            
            NSLog(@"%@开始下载",moviesArray[i]);
            sleep(i+1);//假设后集比前集多耗时1秒,即第一集用时1秒,第二集2秒...
            NSLog(@"%@下载完成",moviesArray[i]);
            
            dispatch_group_leave(group);//抽出
        });
  
    }
    
    //group完成
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        NSLog(@"全部任务下载完成");
    });
    
}

效果一样

GCDGroup.gif

2.概念

GCDGroup概念.png
上图节选自 https://www.jianshu.com/p/324c2fded696 group一节

相关文章

  • iOS 前面任务下载完成,执行后续操作。

    1.思路:GCD调度组:dispatch_group 或者 效果一样 2.概念

  • JavaScript的异步实现

    JavaScript语言的执行环境是‘单线程’的(也就是说,执行后续的代码之前必须完成前面的任务,也就是采用的是阻...

  • GCD实现异步任务---赵永洪笔(p小姐和z先森的故事)

    有时候我们会有这种需求:为了执行下载任务,开启了多个异步任务,需要在在这些异步任务都完成之后执行接下来的操作。这个...

  • 000-调度组

    1、应用场景:调度组一般用于,执行有先后顺序的操作中 本例需求如下:在异步下载完成任务A 和 任务B后在执行任务C

  • 02、NodeJS-基础

    一、异步编程 异步操作 Node大量采用异步操作,即任务不是马上执行,而是直接插入任务队列的尾部,等前面任务执行完...

  • 02、NodeJS-基础

    一、异步编程 异步操作 Node大量采用异步操作,即任务不是马上执行,而是直接插入任务队列的尾部,等前面任务执行完...

  • 执行力的行成

    所谓执行力,指的是贯彻战略意图,完成预定目标的操作能力。执行力,包含完成任务的意愿,完成任务的能力,完成任务的程...

  • GCD dispatch_barrier_async和dispa

    1、栅栏函数使用场景 异步执行两组操作,且第一组操作(多个任务)执行完成后,才开始执行第二组操作(多个任务)。 2...

  • 事件循环(event loop)

    宏任务和微任务 任务队列中都是已完成的异步操作。在当前的微任务没有执行完成时,是不会执行下一个宏任务的。在同步代码...

  • GCD 实现多读单写

    总结:首先栈栏函数的作用,是执行到当前位置,前面的全部任务都要等待,等待block内部任务执行完成后,继续执行其他任务。

网友评论

    本文标题:iOS 前面任务下载完成,执行后续操作。

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