Grand Central Dispatch--GCD
GCD是苹果对多核的并行运行一种解决方案。(iOS中实现多线程目前有4种方案,最常用的是GCD和NSOperation两种)
优点:基于C语言,简单易用,效率高,速度快,会自动管理线程生命周期,开发者只需关心GCD要执行的任务和队列。
缺点: 当GCD的场景复杂时,可能会遇到死锁。
博主只用过NSThread和GCD,觉得GCD用着挺方便的,加之听闻其效率高,感觉高大上,故也掺和掺和。其实我对GCD的理解也不深,只是列出我理解的东西,至少会用就好。
队列
类型 queueType
1⃣️main_queue --主队列 (串行队列)
2⃣️Global_Dispatch_Queue -- 全局调度队列 (并发队列)
[tips:这里解释下串行跟并发,串行是指同一时间只有一个任务被执行,前面的任务没完成,后面的只能等待⌛️;并发队列是指同一时间可以有多个任务被执行,而且
能得到的保证是它们会按照被添加的顺序开始执行,但何时开始,某一时刻有多少个任务执行,都是不确定的,只取决于GCD。
]
上面说到,有主队列和全局调度队列两种,全局调度队列又分为四个不同的优先级(backgroud、low、default、high),故系统中一般至少有五个队列。为何说至少,因为你也可以创建你自己的队列,这样就有不只五个队列了。
同步与异步
同步异步是相对于函数说的,一个同步函数只在它完成了任务才会返回,异步函数在开始了一个Block后立即返回,不管Block任务有没有完成。
dispatch_sync (...^{ } ); 同步执行
dispatch_async (...^{ } ); 异步执行
=>dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_HIGH,0),^{ ... } );
下面列出一些实用的知识
Dispatch_barriers 阻塞
:
让一个并发队列变成串行队列,确保使用barrier提交的Block是队列中惟一执行的条目。
Dispatch_groups 调度组
:
在调度组里的所有任务都完成时,可同步/异步通知你。
. . .(这里写任务)
. . .
后记,觉得这个GCD还是挺难的,在没有熟悉GCD的情况下,请不要乱用复杂的命令于项目中。
参考: