编写高质量代码的52个有效方法

52个有效方法(44) - 通过Dispatch Group机制

2018-10-01  本文已影响27人  SkyMing一C

dispatch group是GCD的一项特性,能够把任务分组。调用者可以等待这组任务执行完毕,也可以在提供回调函数之后继续往下执行,这组任务完成时,调用者会得到通知。这个功能有许多用途,其中最重要、最值得注意的用法,就是把将要并发执行的多个任务合为一组,于是调用者就可以知道这些任务何时才能全部执行完毕。

dispatch_semaphore
dispatch_semaphore_create
dispatch_semaphore_t  dispatch_semaphore_create(long value);
dispatch_semaphore_signal
long dispatch_semaphore_signal(dispatch_semaphore_t dsema);
dispatch_semaphore_wait
long dispatch_semaphore_wait(dispatch_semaphore_t dsema, dispatch_time_t timeout);

DISPATCH_TIME_NOWDISPATCH_TIME_FOREVER

- DISPATCH_TIME_NOW  表示当前;

- DISPATCH_TIME_FOREVER  表示遥远的未来;
  dispatch_time_t dispatch_time(dispatch_time_t when, int64_t delta);
dispatch_time_t  t = dispatch_time(DISPATCH_TIME_NOW, 1*1000*1000*1000);
//表示当前时间向后延时一秒为timeout的时间。
实例代码
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
NSLog(@"group one start");
dispatch_group_async(group, queue, ^{
    dispatch_async(queue, ^{
        sleep(1); //这里线程睡眠1秒钟,模拟异步请求
        NSLog(@"group one finish");
    });
});

dispatch_group_notify(group, queue, ^{
    NSLog(@"group finished");
});

dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
NSLog(@"group one start");
dispatch_group_enter(group);
dispatch_async(queue, ^{
    sleep(1); //这里线程睡眠1秒钟,模拟异步请求
    NSLog(@"group one finish");
    dispatch_group_leave(group);
});

dispatch_group_notify(group, queue, ^{
    NSLog(@"group finished");
});
要点
  1. 一系列任务可归入一个dispatch group中。开发者可以在这组执行完毕时获得通知。

  2. 通过dispatch group,可以在并发式派发队列中同时执行多项任务。此时GCD会根据系统资源来调度这些并发执行的任务。开发者若自己来实现此功能,则需要编写大量代码。

上一篇 下一篇

猜你喜欢

热点阅读