iOS开发笔记>> GCD调度组的使用

特点: 调度组中的所有异步任务执行结束后, 会得到统一的通知

使用场景: 监听一组异步任务是否执行结束, 如果执行结束就能得到统一的通知


常规用法: 

- (void)gcdDemo1
{
    // 调度组
    dispatch_group_t group = dispatch_group_create();

    // 队列
    dispatch_queue_t queue = dispatch_queue_create("zj", DISPATCH_QUEUE_CONCURRENT);

    // 将任务添加到队列和调度组
    dispatch_group_async(group, queue, ^{
        NSLog(@"下载 A %@",[NSThread currentThread]);
    });

    dispatch_group_async(group, queue, ^{
        NSLog(@"下载 B %@",[NSThread currentThread]);
    });

    dispatch_group_async(group, queue, ^{
        NSLog(@"下载 C %@",[NSThread currentThread]);
    });

    // 异步 : 调度组中的所有异步任务执行结束之后,在这里得到统一的通知
    dispatch_group_notify(group, queue, ^{
        NSLog(@"下载完成 %@",[NSThread currentThread]);
    });

    // 同步 : 一直等到调度组中所有的任务都执行结束以后才执行后面的代码
//    dispatch_group_wait(group, DISPATCH_TIME_FOREVER);

    // 验证调度组是否是异步
    NSLog(@"end");
}
注: dispatch_group_notify 这个函数是异步的, 如果换成同步用 dispatch_group_wait(group, DISPATCH_TIME_FOREVER), 用了同步的代码, 一直等调度组中的所有任务执行结束后才执行后面的代码


enter 和 leavel 

dispatch_group_enter(group)函数内部实现原理
终端输入:man dispatch_group_enter 
连续两个空格
The dispatch_group_async() convenience function behaves like so:

void
dispatch_group_async(dispatch_group_t group, dispatch_queue_t queue, dispat
                     ch_block_t block)
{
    dispatch_retain(group);
    dispatch_group_enter(group);
    dispatch_async(queue, ^{
        block();
        dispatch_group_leave(group);
        dispatch_release(group);
    });
}
dispatch_group_leave(group)函数, 必须和dispatch_group_enter(group)成对出现, 必须在block的最后一句
用法: 
- (void)gcdDemo2
{
    // 调度组
    dispatch_group_t group = dispatch_group_create();

    // 队列
    dispatch_queue_t queue = dispatch_queue_create("zj", DISPATCH_QUEUE_CONCURRENT);

    // dispatch_group_enter 和 dispatch_group_leave 必须成对出现
    dispatch_group_enter(group);
    dispatch_group_async(group, queue, ^{

        NSLog(@"下载 A %@",[NSThread currentThread]);

        // dispatch_group_leave 必须是 block 的最后一句
        dispatch_group_leave(group);
    });

    dispatch_group_enter(group);
    dispatch_group_async(group, queue, ^{
        NSLog(@"下载 B %@",[NSThread currentThread]);
        dispatch_group_leave(group);
    });

    dispatch_group_enter(group);
    dispatch_group_async(group, queue, ^{
        NSLog(@"下载 C %@",[NSThread currentThread]);
        dispatch_group_leave(group);
    });

    // 异步 : 调度组中的所有异步任务执行结束之后,在这里得到统一的通知
    dispatch_group_notify(group, queue, ^{
        NSLog(@"下载完成 %@",[NSThread currentThread]);
    });

    // 同步 : 一直等到调度组中所有的任务都执行结束以后才执行后面的代码
//    dispatch_group_wait(group, DISPATCH_TIME_FOREVER);

    // 验证调度组是否是异步
    NSLog(@"end");
}
使用场景: SDWebImage下载图片, 所有下载图片任务下载完成之后进行回调
注: 同样 一直等调度组中的所有任务执行结束后才执行后面的代码, 也可以换成同步, 请参考常规用法



你可能感兴趣的:(iOS,编程开发)