美文网首页
iOS 多线程之dispatch_group

iOS 多线程之dispatch_group

作者: 枫叶无处漂泊 | 来源:发表于2019-12-12 17:54 被阅读0次

    前言

    在开发app的时候,难免会遇到这样的需求:当你需要异步请求两个接口,必须两个两个接口完成才能刷新界面。在例如要请求三张图片的接口,然后把三张请求完的图片合成一张图。这个时候就需要用到dispatch_group队列组。

    dispatch_group 队列组

    
    //DISPATCH_QUEUE_CONCURRENT创建并发队列
    //    dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_CONCURRENT);
        //这个方法也可以,创建并发队列
        dispatch_queue_t globalQue = dispatch_get_global_queue(0, 0);
       
        dispatch_group_async(group, globalQue, ^{
            
            sleep(1);
            NSLog(@"休眠1s 执行任务");
        });
        
        dispatch_group_async(group, globalQue, ^{
            
            sleep(2);
            NSLog(@"休眠2s 执行任务");
        });
        
        dispatch_group_async(group, globalQue, ^{
            
            sleep(3);
            NSLog(@"休眠3秒 执行任务");
        });
        dispatch_group_notify(group, dispatch_get_main_queue(), ^{
            
            //前三组是并行执行的,3s后这三个线程都执行完毕,会执行done
            NSLog(@"done");
        });
    
    

    多次执行,打印结果:

    休眠1s 执行任务
    休眠2s 执行任务
    休眠3秒 执行任务
    done
    
    

    只有当三个任务都执行完毕,才会执行dispatch_group_notify这个方法,做一些处理。

    dispatch_group_wait 暂停当前线程

    暂停当前线程(阻塞当前线程),等待指定的 group 中的任务执行完成后,才会往下继续执行。

    下面用代码来演示一下:

    dispatch_group_t group = dispatch_group_create();
    dispatch_queue_t globalQue = dispatch_get_global_queue(0, 0);
    dispatch_group_async(group, globalQue, ^{
                  
        sleep(1);
        NSLog(@"休眠1s 执行任务");
     });
              
    dispatch_group_async(group, globalQue, ^{
                  
        sleep(2);
        NSLog(@"休眠2s 执行任务");
    });
    
    // 等待上面的任务全部完成后,会往下继续执行(会阻塞当前线程)
    dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
    NSLog(@"end");
    }
    
    

    多次执行结果都会发现打印end都是最后执行。

    休眠1s 执行任务
    休眠2s 执行任务
    end
    
    

    当所有任务执行完成之后,才执行 dispatch_group_wait 之后的操作。但是,使用dispatch_group_wait 会阻塞当前线程。

    dispatch_group_enter/dispatch_group_leave

    这种方式用在不使用dispatch_group_async来提交任务,且必须配合使用.相当于dispatch_group_async.

    休眠1s 执行任务
    休眠2s 执行任务
    done
    
    

    个人任务和内存管理的引用计数类似,我们可以认为group也持有一个整形变量(只是假设),当调用enter时计数加1,调用leave时计数减1,当计数为0时会调用dispatch_group_notify并且dispatch_group_wait会停止等待;

    相关文章

      网友评论

          本文标题:iOS 多线程之dispatch_group

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