iOS 笔记---GCD篇(1)

作者: 七号萝卜 | 来源:发表于2016-03-24 21:11 被阅读165次

    目前在iOS开发中,用到多线程的时候自然就想到用GCD,因为方便快捷,代码清晰。因此记录一下。

    介绍

    什么是GCD?
    在官方解释里,全名为Grand Central Dispatch,是异步执行任务的技术之一。一般将应用程序中的线程管理用的代码在系统级中实现。所以可统一管理,也可执行任务,并且比以前的线程更有效率。
    为什么要用GCD呢?
    因为GCD很强大,它可以自动利用更多的CPU内核,会自动管理线程的生命周期(创建线程、调度任务、摧毁线程)。最最重要的原因是它用起来简单啊,只需要告诉GCD想要执行什么事情就行了,不需要编写任何线程管理的代码。

    GCD可以用很简洁的语法就实现比较复杂的多线程编程。比如一个简单的GCD可以写成:

    dispatch_async(queue,^{ 
    //这里执行需要长时间处理的事情, 
    //比如数据库访问,网络请求啥的 
    
    
        //结束后返回主线程执行结果,一般是刷新UI 
        dispatch_async(dispatch_get_main_queue(),^{ 
                      //界面刷新
         });
    });
    

    就这么几步就可以在后台开一个线程,然后执行了耗时操作返回主线程刷新。蛮简洁优雅的。GCD中的函数大多数是以dispatch开头。

    再看看官方对GCD的说明:

    开发者要做的只是定义想要执行的任务,并将之追加到适当的Dispatch Queue(队列)中。

    于是,可得到GCD中有两个核心的概念:任务和队列。
    看GCD的基本函数:

    //用同步的方式执行任务
    dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);
    
    //用异步的方式执行任务
    dispatch_async(dispatch_queue_t queue, dispatch_block_t block);
    

    有两个参数,第一个就是队列,第二个block就是任务。

    • 任务是指我们要做的一些操作。
    • 队列就是指Dispatch Queue。

    什么是Dispatch Queue

    Dispatch Queue指执行处理的等待队列。编程人员通过dispatch_async等函数可以将后面Block中包含的操作追加到Dispatch Queue中。Dispatch Queue按照追加的顺序(FIFO)执行处理。
    图如下:


    通过Dispatch Queue执行处理.png

    在GCD中,队列被分为两种:

    • Serial Dispatch Queue:串行队列。
    • Concurrent Dispatch Queue:并发队列。

    Dispatch Queue的种类(为什么简书上markdown打表格没效。。)

    种类.png 两类Queue.png

    看图可知:Serial需要里面的任务一个接一个的进行,而Concurrent即不会,会同时开几条线程执行。
    比如我们输入下面代码:

    //创建GCD队列
    dispatch_queue_t queue = dispatch_queue_create("com.wang.MySerialDispatchQueue", NULL);
    dispatch_async(queue, ^{ 
          NSLog(@"这是1----%@",[NSThread currentThread]);
     });
    dispatch_async(queue, ^{ 
          NSLog(@"这是2----%@",[NSThread currentThread]);
     });
    dispatch_async(queue, ^{ 
          NSLog(@"这是3----%@",[NSThread currentThread]);
     });
    dispatch_async(queue, ^{ 
          NSLog(@"这是4----%@",[NSThread currentThread]);
     });
    dispatch_async(queue, ^{ 
          NSLog(@"这是5----%@",[NSThread currentThread]);
     });
    dispatch_async(queue, ^{ 
          NSLog(@"这是6----%@",[NSThread currentThread]);
     });
    

    上面是Serial Dispatch Queue,看Log输出:


    Serial Dispatch Queue.png

    没错,Serial Dispatch Queue只新开了一条线程,加进那个队列的都是按着顺序执行的!
    接下来换成Concurrent Dispatch Queue ,只需改一个地方,NULL改成DISPATCH_QUEUE_CONCURRENT:

    dispatch_queue_t queue = dispatch_queue_create("com.wang.MySerialDispatchQueue", DISPATCH_QUEUE_CONCURRENT);
    

    再看:


    Concurrent Dispatch Queue.png

    此时的线程数开了就不止一个了,而且也不是按着顺序来的。

    所以,串行队列和并发队列的比较如下:
    图:


    开线程比较.png

    同步、异步、并发、串行说明
    同步和异步决定要不要开新线程:

    • 同步:在当前线程中执行任务,不具备开启新线程的功能
    • 异步:在新线程中执行任务,具备开启新线程的能力

    并发和串行决定任务的执行方式:

    • 并发:多个任务并发(同时)执行
    • 串行:一个任务执行完毕后,再执行下一个任务

    GCD第一篇就记录到这里。

    相关文章

      网友评论

      本文标题:iOS 笔记---GCD篇(1)

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