GCD详解

作者: 任梦RM | 来源:发表于2016-11-30 13:15 被阅读24次

    GCD的基本思想就是将操作(任务)放在队列中去执行,队列负责调度任务执行,所在的线程以及具体的执行时间,队列的特点是先进先出,新添加至队列的操作(任务)都会排在队尾。
    GCD的函数都是以dispatch开头的,dispatch的意思是“分配、调度”

    • 串行队列中的任务会按顺序执行

    • 并行队列中的任务通常会并发执行,而且无法确定任务的执行顺序

    • dispatch_async表示异步操作,异步操作会新开辟线程来执行任务,而且无法确定任务的执行顺序

    • dispatch_sync表示同步操作,同步操作不会新开辟线程

    1. 在串行队列中执行同步任务:不会新建线程,按顺序执行任务(毫无用处)
        //1 .创建一个串行队列
        dispatch_queue_t serailQueue = dispatch_queue_create("serailQueue", DISPATCH_QUEUE_SERIAL);
        //2.在队列中同步执行,不具有开启新线程的能力+
        dispatch_sync(serailQueue, ^{
            NSLog(@"1 = %@",[NSThread currentThread]);
        });
        dispatch_sync(serailQueue, ^{
            NSLog(@"2 = %@",[NSThread currentThread]);
        });
        dispatch_sync(serailQueue, ^{
            NSLog(@"3 = %@",[NSThread currentThread]);
        });
    
    2. 在串行队列中执行异步任务,会新建线程,按顺序执行任务(非常有用)
        //1.创建串行队列
        dispatch_queue_t serialQueue = dispatch_queue_create("serialQueue", DISPATCH_QUEUE_SERIAL);
        //2. 异步执行任务 ,可以创建新线程
        dispatch_async(serialQueue, ^{
            NSLog(@"1 = %@",[NSThread currentThread]);
        });
        dispatch_async(serialQueue, ^{
            NSLog(@"2 = %@",[NSThread currentThread]);
        });
        dispatch_async(serialQueue, ^{
            NSLog(@"3 = %@",[NSThread currentThread]);
        });
    
    3. 在并行队列中执行同步任务:不会新建线程,按顺序执行任务(几乎没用)
        // 1.创建并行队列
        dispatch_queue_t serialQueue = dispatch_queue_create("serialQueue", DISPATCH_QUEUE_CONCURRENT);
        // 2. 同步执行任务,不具有创建新线程的能力
        dispatch_sync(serialQueue, ^{
            NSLog(@"1 = %@",[NSThread currentThread]);
        });
        dispatch_sync(serialQueue, ^{
            NSLog(@"2 = %@",[NSThread currentThread]);
        });
        dispatch_sync(serialQueue, ^{
            NSLog(@"3 = %@",[NSThread currentThread]);
        });
    
    4. 在并行队列中执行异步任务:会新建多个线程,但是无法确定任务的执行顺序(有用,但是很容易出错)
        // 1.创建并行队列
        dispatch_queue_t concurrentQueue = dispatch_get_global_queue(0, 0);
        // 2.异步执行任务
        dispatch_async(concurrentQueue, ^{
            NSLog(@"1 = %@",[NSThread currentThread]);
        });
        dispatch_async(concurrentQueue, ^{
            NSLog(@"2 = %@",[NSThread currentThread]);
        });
        dispatch_async(concurrentQueue, ^{
            NSLog(@"3 = %@",[NSThread currentThread]);
        });
    

    全局队列:

    全局队列是系统的,直接拿过来就可以用,与并行队列类似,但是不能指定队列的名字,调试时无法确认任务所在队列。

    • 在全局队列中执行同步任务:不会新建线程,按顺序执行任务
    • 在全局队列中执行异步任务:会新建多个线程,但是无法确定任务的执行顺序
        // 1.创建并行队列
        dispatch_queue_t concurrentQueue = dispatch_get_global_queue(0, 0);
        // 2.异步执行任务
        dispatch_async(concurrentQueue, ^{
            NSLog(@"1 = %@",[NSThread currentThread]);
        });
        dispatch_async(concurrentQueue, ^{
            NSLog(@"2 = %@",[NSThread currentThread]);
        });
        dispatch_async(concurrentQueue, ^{
            NSLog(@"3 = %@",[NSThread currentThread]);
        });
    

    主队列:

    每一个应用程序只有一个主线程即只有一个主队列
    为什么需要再主线程上执行任务呢?因为在ios开发中,所有UI的更新任务都必须在主线程上执行。
    主队列中的操作都是在主线程中执行的,不存在异步的概念
    主队列中添加的同步操作永远不会被执行(会死锁)

        //1.获取主队列
        dispatch_queue_t mainQueue = dispatch_get_main_queue();
      
        dispatch_async(mainQueue, ^{
                    NSLog(@"1 = %@",[NSThread currentThread]);
                });
        dispatch_async(mainQueue, ^{
                    NSLog(@"2 = %@",[NSThread currentThread]);
                });
        dispatch_async(mainQueue, ^{
                    NSLog(@"3 = %@",[NSThread currentThread]);
                });
    

    GCD 组的应用和监听

        //1. 找到全局的并行队列
        dispatch_queue_t concurrentQueue = dispatch_get_global_queue(0, 0);
        //2.找到组
        dispatch_group_t group = dispatch_group_create();
        //3.添加任务
        dispatch_group_async(group, concurrentQueue, ^{
            NSLog(@"1 = %@",[NSThread currentThread]);
        });
        dispatch_group_async(group, concurrentQueue, ^{
            NSLog(@"2 = %@",[NSThread currentThread]);
        });
        dispatch_group_async(group, concurrentQueue, ^{
            NSLog(@"3 = %@",[NSThread currentThread]);
        });
        // 4. 监听完成
        dispatch_group_notify(group, concurrentQueue, ^{
            NSLog(@"任务全部完成");
        });
    

    相关文章

      网友评论

          本文标题:GCD详解

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