GCD 小结

作者: jianshu_wl | 来源:发表于2016-07-08 17:30 被阅读449次

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

    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(@"任务执行完毕!");
        });
    

    结果如下:

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

    相关文章

      网友评论

        本文标题:GCD 小结

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