你的名字:GCD

作者: 市民张某 | 来源:发表于2016-12-07 19:31 被阅读214次

    简介

       GCD全称是Grand Central Dispatch,翻译为中枢调度器,是苹果开发的一个多核并行运算的解决方案。GCD旨在代替诸如NSThread、NSOperation等技术,它结合block可以更加方便的进行多线程开发。

    任务和队列

    1.任务
     
    任务指的是你要执行的操作。
    2.队列(串行队列和并行队列)
        串行队列意味着不能开辟新线程,只能将队列中的任务放到主线程中,每次也只能执行一个任务。并行队列则相反,可以开辟新线程,一次可以执行多个任务,不必等到执行的任务完成才执行下一个。

    网上找的图.jpg

    基本操作

       1.创建队列
           
    dispatch_queue_create方法第一个参数是为自定义队列的名称;第二个参数是设置自定义队列为串行还是并行。DISPATCH_QUEUE_SERIAL/NULL为串行队列,DISPATCH_QUEUE_CONCURRENT为并行队列。

    自定义队列.jpg

       系统也提供了另外两种创建好的队列:全局队列和主队列。
       全局队列属于并行队列,全局可见;第一个参数为设置队列优先级;第二个参数暂无意义。

    全局队列.jpg 全局队列第一个参数.jpg

    主队列属于串行队列,运行在主线程中。

    主队列.jpg


       2.执行任务

           1)常用的执行方式有两种:同步执行(sync)和异步执行(async)。同步执行不具备开启新线程的能力,而异步执行则相反。第一个参数指的是任务的队列,第二个参数就是任务。

    执行任务.jpg


    组合.jpg

              常用的用法:

    常用用法.jpg

           2)dispatch_apply:该函数按指定的次数将block任务添加到指定的队列中。

    dispatch_apply.jpg

                该函数可用于循环调用block任务,串行并行取决于加到哪个队列中。

    循环调用.jpg

            3)dispatch_barrier_async和dispatch_barrier_async:该函数需要等到函数前面的操作执行完才能够执行,且得等到函数执行完毕后函数后面的操作才能执行。

    barrierjpg

           3)dispatch_after:该函数让我们延时将block加入到队列中,而不是延时执行block任务。第一个参数为延迟的时间;第二个为指定队列,第三个为block任务。

    after.jpg

                  创建dispatch_time _t的函数dispatch_time有两个参数。第一个为时间模式,时间模式分为两种:相对时间(DISPATCH_TIME_NOW)和绝对时间(DISPATCH_TIME_FOREVER);第二个为延迟的时间值,系统也提供了常量供我们使用:NSEC_PER_SEC(每秒多少纳秒)、NSEC_PER_MSEC(每毫秒多少纳秒)、USEC_PER_SEC(每秒多少微秒)、NSEC_PER_USEC(每微妙多少纳秒)

      3.dispatch group
            用于将多个block任务归为一组,以检测这些任务全部完成或者等待全部完成时发出的消息。有几个函数需要注意:dispatch_group_notify函数只有当group里面的所有block任务完成后才会被调用;dispatch_group_wait函数指当group所有任务执行完或者等待指定时间后才会被调用。怎么证明呢,请看下面两张图。(PS : dispatch_group_notify也能通过打印信息验证。)

    图1.jpg


    图2.jpg

    3.dispatch once
           dispatch_once函数仅仅执行一次block任务,仅当onceToken为零时才会执行block任务。任务执行完onceToken的值又改为非零。

    dispatch_once.jpg

    4.信号量
        信号量是一个整型值并有一个初始数值,支持两个操作:信号通知和信号等待。每调用dispatch_semaphore_wait一次,其计数为减一;每调用一次dispatch_semaphore_signal,计数为加一。当计数小于零时,dispatch_semaphore_wait后面的操作无法执行,线程被阻塞。

    信号量.jpg

       5.dispatch source
            它用于检测系统底层某些特定类型的事件,只有当特定类型发生时才会将block任务放到队列中。详细请浏览:http://songzengbin.github.io/blog/2013/08/15/dispatchzhi-yan-jiu-xue-xi/
        6.dispatch_suspenddispatch_resume
             dispatch_suspend,dispatch_resume分别对应的是队列的挂起和恢复。当挂起时有block正在执行的话是需要等到当前block任务执行完后队列才能被挂起。

    挂起和恢复.jpg

    相关文章

      网友评论

        本文标题:你的名字:GCD

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