简介
GCD全称是Grand Central Dispatch,翻译为中枢调度器,是苹果开发的一个多核并行运算的解决方案。GCD旨在代替诸如NSThread、NSOperation等技术,它结合block可以更加方便的进行多线程开发。
任务和队列
1.任务
任务指的是你要执行的操作。
2.队列(串行队列和并行队列)
串行队列意味着不能开辟新线程,只能将队列中的任务放到主线程中,每次也只能执行一个任务。并行队列则相反,可以开辟新线程,一次可以执行多个任务,不必等到执行的任务完成才执行下一个。
基本操作
1.创建队列
dispatch_queue_create方法第一个参数是为自定义队列的名称;第二个参数是设置自定义队列为串行还是并行。DISPATCH_QUEUE_SERIAL/NULL为串行队列,DISPATCH_QUEUE_CONCURRENT为并行队列。
系统也提供了另外两种创建好的队列:全局队列和主队列。
全局队列属于并行队列,全局可见;第一个参数为设置队列优先级;第二个参数暂无意义。
主队列属于串行队列,运行在主线程中。
2.执行任务
1)常用的执行方式有两种:同步执行(sync)和异步执行(async)。同步执行不具备开启新线程的能力,而异步执行则相反。第一个参数指的是任务的队列,第二个参数就是任务。
常用的用法:
2)dispatch_apply:该函数按指定的次数将block任务添加到指定的队列中。
该函数可用于循环调用block任务,串行并行取决于加到哪个队列中。
3)dispatch_barrier_async和dispatch_barrier_async:该函数需要等到函数前面的操作执行完才能够执行,且得等到函数执行完毕后函数后面的操作才能执行。
3)dispatch_after:该函数让我们延时将block加入到队列中,而不是延时执行block任务。第一个参数为延迟的时间;第二个为指定队列,第三个为block任务。
创建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也能通过打印信息验证。)
3.dispatch once
dispatch_once函数仅仅执行一次block任务,仅当onceToken为零时才会执行block任务。任务执行完onceToken的值又改为非零。
4.信号量
信号量是一个整型值并有一个初始数值,支持两个操作:信号通知和信号等待。每调用dispatch_semaphore_wait一次,其计数为减一;每调用一次dispatch_semaphore_signal,计数为加一。当计数小于零时,dispatch_semaphore_wait后面的操作无法执行,线程被阻塞。
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任务执行完后队列才能被挂起。