码迷,mamicode.com
首页 > 编程语言 > 详细

GCD线程依赖,GCD队列组,线程监听,线程等待

时间:2018-09-30 11:27:33      阅读:174      评论:0      收藏:0      [点我收藏+]

标签:bsp   int   oid   异步   dispatch   wait   完成   default   16px   

1.线程监听

有时候经常有这样的需求,AB任务都执行完成之后,刷新界面或者执行其他操作,

/**
 * 队列组 dispatch_group_notify
 */
- (void)groupNotify {
    NSLog(@"begin");
    
    dispatch_group_t group =  dispatch_group_create();
    
    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        // 追加任务1
        for (int i = 0; i < 2; ++i) {
            NSLog(@"任务1---%@",[NSThread currentThread]);      // 打印当前线程
        }
    });
    
    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        // 追加任务2
        for (int i = 0; i < 2; ++i) {
            NSLog(@"任务2---%@",[NSThread currentThread]);      // 打印当前线程
        }
    });
    
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        // 等前面的异步任务1、任务2都执行完毕后,回到主线程执行任务
        for (int i = 0; i < 2; ++i) {
            NSLog(@"等待1,2完成后的任务3---%@",[NSThread currentThread]);      // 打印当前线程
        }
        NSLog(@"end");
    });
}

  

技术分享图片

 

 

2.线程等待

 

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

从dispatch_group_wait相关代码运行输出结果可以看出:

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

/**
 * 队列组 dispatch_group_wait
 */
- (void)groupWait {

    NSLog(@"begin");
    
    dispatch_group_t group =  dispatch_group_create();
    
    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        // 追加任务1
        for (int i = 0; i < 2; ++i) {
            NSLog(@"任务1---%@",[NSThread currentThread]);      // 打印当前线程
        }
    });
    
    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        // 追加任务2
        for (int i = 0; i < 2; ++i) {
            NSLog(@"任务2---%@",[NSThread currentThread]);      // 打印当前线程
        }
    });
    
    // 等待上面的任务全部完成后,会往下继续执行(会阻塞当前线程)
    dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
    
    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        // 追加任务3
        for (int i = 0; i < 2; ++i) {
            NSLog(@"任务3---%@",[NSThread currentThread]);      // 打印当前线程
        }
    });
    
  
}

  技术分享图片

 

GCD线程依赖,GCD队列组,线程监听,线程等待

标签:bsp   int   oid   异步   dispatch   wait   完成   default   16px   

原文地址:https://www.cnblogs.com/huangzhenwei/p/9728582.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!