GCD 小结

一、 同步/异步、串行/并行的区别

1.同步/异步

同步/异步是指线程与线程之间的关系.

2.串行/并行

串行/并行是指队列内部任务与任务之间的关系.
如果是串行队列,那么队列内部的任务是按顺序执行的.
如果是并行队列, 那么队列内部的任务执行是无序的, 没有先后顺序.

二、 线程与队列

1. 线程
//同步线程
dispatch_sync(<#dispatch_queue_t queue#>, <#^(void)block#>)
//异步线程
dispatch_async(<#dispatch_queue_t queue#>, <#^(void)block#>)
2. 队列
//创建一个串行队列
dispatch_queue_t queue = dispatch_queue_create("label", DISPATCH_QUEUE_SERIAL);
//创建一个并行队列
dispatch_queue_t queue = dispatch_queue_create("label", DISPATCH_QUEUE_CONCURRENT);
//获取全局队列, 全局队列是并行的
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
//获取主线程的队列, 主线程队列是串行的
dispatch_queue_t queue = dispatch_get_main_queue();

三、几种常见的任务处理方式

1. 异步串行队列
dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_SERIAL);
    for (int i = 0; i < 10; i++) {
        dispatch_async(queue, ^{
            NSLog(@"------- %d", i);
        });
    }

队列中所有任务在异步线程中按顺序执行, 结果如下:

异步串行队列
2. 异步并行队列
dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_CONCURRENT);
    for (int i = 0; i < 10; i++) {
        dispatch_async(queue, ^{
            NSLog(@"------- %d", i);
        });
    }

队列中所有任务在异步线程并行执行, 无先后顺序, 结果如下:

异步并行队列
3. 异步串行队列, 并在任务完成后进行通知
dispatch_group_t group = dispatch_group_create();
    dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_SERIAL);
    for (int i = 0; i < 10; i++) {
        dispatch_group_async(group, queue, ^{
            NSLog(@"------- %d", i);
        });
    }
    dispatch_group_notify(group, queue, ^{
        NSLog(@"任务执行完毕!");
    });

运行结果如下:

异步串行队列, 并在任务完成后进行通知
4. 异步并行队列, 并在任务完成后进行通知
dispatch_group_t group = dispatch_group_create();
    dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_CONCURRENT);
    for (int i = 0; i < 10; i++) {
        dispatch_group_async(group, queue, ^{
            NSLog(@"------- %d", i);
        });
    }
    dispatch_group_notify(group, queue, ^{
        NSLog(@"任务执行完毕!");
    });

结果如下:

异步并行队列, 并在任务完成后进行通知

推荐阅读更多精彩内容