美文网首页
GCD队列组

GCD队列组

作者: 鐧箪 | 来源:发表于2019-05-29 15:21 被阅读0次
    dispatch_group

    在多线程的操作中 有时候有多个任务异步去执行 执行完后想统一处理某些事情 就可以考虑用队列组

    dispatch_group_t group = dispatch_group_create();
        dispatch_queue_global_t quene = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
        dispatch_group_async(group, quene, ^{
            NSLog(@"线程1 --------%@",[NSThread currentThread]);
            sleep(5);
            NSLog(@"1号任务完成啦");
        });
        
        dispatch_group_async(group, quene, ^{
            NSLog(@"线程2 --------%@",[NSThread currentThread]);
            sleep(5);
            NSLog(@"2号任务完成啦");
        });
        
        dispatch_group_notify(group, dispatch_get_main_queue(), ^{
            NSLog(@"任务完成啦");
        });
    
    线程2 --------<NSThread: 0x600000704280>{number = 4, name = (null)}
    线程1 --------<NSThread: 0x600000704240>{number = 3, name = (null)}
    2号任务完成啦
    1号任务完成啦
    任务完成啦
    
    dispatch_group_wait 等待
    dispatch_group_t group = dispatch_group_create();
        dispatch_queue_global_t quene = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
        dispatch_group_async(group, quene, ^{
            NSLog(@"线程1 --------%@",[NSThread currentThread]);
            sleep(5);
            NSLog(@"1号任务完成啦");
        });
        
        dispatch_group_async(group, quene, ^{
            NSLog(@"线程2 --------%@",[NSThread currentThread]);
            sleep(5);
            NSLog(@"2号任务完成啦");
        });
        
        dispatch_group_notify(group, dispatch_get_main_queue(), ^{
            NSLog(@"任务完成啦");
        });
        
        NSLog(@"你在做什么?");
        dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
        NSLog(@"你好了没有啊!!!!!");
    
    2019-05-29 14:32:13.713234+0800 GCD[31616:422407] 你在做什么?
    线程2 --------<NSThread: 0x60000023a4c0>{number = 4, name = (null)}
    线程1 --------<NSThread: 0x60000023d8c0>{number = 3, name = (null)}
     2号任务完成啦
    1号任务完成啦
    你好了没有啊!!!!!
    任务完成啦
    

    可以看出 dispatch_group_wait 阻塞了主线程 等待 group 组内任务完成 才继续向下执行

    dispatch_group_enter dispatch_group_leave

    自己手动把任务加入 队列组 通过 dispatch_group_enter 添加 任务+1 通过 dispatch_group_leave 移除 任务-1 当任务为0 的时候 执行 dispatch_group_notify dispatch_group_wait

    dispatch_group_t group = dispatch_group_create();
        dispatch_queue_global_t quene = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
        dispatch_group_enter(group);
        dispatch_async(quene, ^{
            NSLog(@"线程1 --------%@",[NSThread currentThread]);
            sleep(5);
            NSLog(@"1号任务完成啦");
            dispatch_group_leave(group);
        });
        
        dispatch_group_enter(group);
        dispatch_async(quene, ^{
            NSLog(@"线程2 --------%@",[NSThread currentThread]);
            sleep(5);
            NSLog(@"2号任务完成啦");
            dispatch_group_leave(group);
        });
        
        
        dispatch_group_notify(group, dispatch_get_main_queue(), ^{
            NSLog(@"任务完成啦");
        });
        
        dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
        NSLog(@"你好了没有啊!!!!!");
    
    线程1 --------<NSThread: 0x60000328e7c0>{number = 3, name = (null)}
    线程2 --------<NSThread: 0x600003289480>{number = 4, name = (null)}
    1号任务完成啦
    2号任务完成啦
    你好了没有啊!!!!!
    任务完成啦
    
    dispatch_apply GCD快速迭代

    遍历任务 并发处理 GCD控制线程数量 不会出现问题

    dispatch_queue_t quene = dispatch_queue_create("dy", DISPATCH_QUEUE_CONCURRENT);
    dispatch_apply(1000, quene, ^(size_t i) {
            NSLog(@"我在哪里啊-----%@",[NSThread currentThread]);
        });
    

    相关文章

      网友评论

          本文标题:GCD队列组

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