你的名字:GCD

2017-01-11 16:04:32来源:http://www.jianshu.com/p/6cd9d1a80239作者:Abner_诚人点击

简介

   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_suspend,dispatch_resume
         dispatch_suspend,dispatch_resume分别对应的是队列的挂起和恢复。当挂起时有block正在执行的话是需要等到当前block任务执行完后队列才能被挂起。



挂起和恢复.jpg


最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台