苹果官方对gcd的说明:
Dispatch Queue
开发者要做的只是定义想执行的任务并追加到适当的dispatch queue中。
这句话用源代码表示如下:
dispatch_async(queue, ^{
//想执行的任务
});
该源代码使用block语法,定义想执行的任务,通过dispatch_async函数追加赋值在变量queue的dispatch queue(派发队列)中。仅这样就可以指定block在另一线程中执行。
那么Dispatch Queue是什么呢?
是执行处理的等待队列,应用程序编程人员通过dispatch_async函数等API,在block语法中记述想执行的处理并将其追加到Dispatch Queue中。
Dispatch Queue按照追加的顺序(先进先出),执行处理。
在执行处理时,存在两种Dispatch Queue,
一种是等待现在执行中处理的serial Dispatch Queue,
另一种是不等待现在执行中处理的Concurrent Dispatch Queue。
从字面意思,我们也可以好好理解这两种队列的性质
serial是“连续的”,典型用法是连续剧(一集接着一集,不是多集同时播放)。
Concurrent 是“同时发生的”的意思。
来看一段伪代码
dispatch_async(queue, block0);
dispatch_async(queue, block1);
dispatch_async(queue, block2);
dispatch_async(queue, block3);
dispatch_async(queue, block4);
dispatch_async(queue, block5);
dispatch_async(queue, block6);
dispatch_async(queue, block7);
当queue为serial Dispatch Queue时,如同连续剧一样,先执行block0,等到block0执行完毕后,再执行block1,如此重复。
同时执行的处理数只能有1个,即执行该源代码后,一定按照顺序进行处理。
感觉是串行
block0
block1
block2
block3
block4
block5
block6
block7
当变量queue为Concurrent Dispatch Queue时,不用等待现在执行中的处理结束,首先执行block0,不管block0执行是否结束,都开始执行block1,不管是否执行完毕,都开始执行block2,如此重复循环。
这样虽然不用等待处理结束,可以并行执行各个处理,但是并行执行的处理数量取决于当时系统的状态,即iOS基于派发队列
的处理数,cpu的核心数及cpu负荷等当前系统状态来决定 派发队列中并行执行的处理数,所谓并行执行,就是使用多个线程同时执行多个处理。
执行顺序会根据处理内容和系统状态发生改变。
在不能改变执行顺序或者不想并行执行,使用serial Dispatch Queue