美文网首页
dispatch_group

dispatch_group

作者: AntKing | 来源:发表于2017-03-27 13:06 被阅读0次
    • 方式1
    
        dispatch_queue_t dispatchQueue = dispatch_queue_create("ted.queue.next", DISPATCH_QUEUE_CONCURRENT);
        dispatch_group_t dispatchGroup = dispatch_group_create();
        dispatch_group_async(dispatchGroup, dispatchQueue, ^(){
            NSLog(@"dispatch-1");
        });
        dispatch_group_async(dispatchGroup, dispatchQueue, ^(){
            NSLog(@"dspatch-2");
        });
        dispatch_group_notify(dispatchGroup, dispatch_get_main_queue(), ^(){
            NSLog(@"end");
        });
    
    

    因为是异步并发执行,所以dispatch-1,dspatch-2,顺序是不固定的,但是end肯定是在dispatch-1,dspatch-2,都执行完成之后才执行

    • 方式2
        dispatch_group_t group = dispatch_group_create();
        dispatch_group_enter(group);
        
        NSLog(@"1111");
        NSLog(@"2222");
        
        dispatch_group_leave(group);
        
        dispatch_group_notify(group, dispatch_get_main_queue(), ^{
            NSLog(@"3333");
        });
    
    
    • 方式3
        // 因为 dispatch_group_wait 会阻塞线程,所以创建一个新的线程,用来完成任务
        // 同时用异步的方式向新线程(tasksQueue)中添加任务
        dispatch_queue_t tasksQueue = dispatch_queue_create("tasksQueue", DISPATCH_QUEUE_CONCURRENT);
        dispatch_async(tasksQueue, ^{
            // 真正用来完成任务的线程
            dispatch_queue_t performTasksQueue = dispatch_queue_create("performTasksQueue", DISPATCH_QUEUE_CONCURRENT);
            dispatch_group_t group = dispatch_group_create();
            for (int i = 0; i < 3; i++) {
                // 入组之后的 block 会被 group 监听
                // 注意:dispatch_group_enter 一定和 dispatch_group_leave 要配对出现
                dispatch_group_enter(group);
                dispatch_async(performTasksQueue, ^{
                    NSLog(@"开始第 %zd 项任务", i);
                    [NSThread sleepForTimeInterval:(3 - i)];
                    dispatch_group_leave(group);
                    NSLog(@"完成第 %zd 项任务", i);
                });
            }
            //dispatch_group_wait会阻塞主线程,所以在异步并发的子线程里用
            dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
            dispatch_async(dispatch_get_main_queue(), ^{
                NSLog(@"全部任务完成");
            });
        });
    
    

    相关文章

      网友评论

          本文标题:dispatch_group

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