GCD 在swift中的使用

##GCD简单介绍

1、Dispatch Semaphores:信号量,可以让我们实现更加复杂的并发控制,防止资源竞争

2、三种队列的获取方式

串行队列:系统默认并不提供串行队列,需要我们手动创建

let queue = DispatchQueue(label: "serialQueue")

并行队列:这里只讨论系统提供的全局队列。在 iOS >= 8 之后,优先级的概念被苹果使用 QoS 替代了,我们不再使用优先级,而是使用 QoS 来描述全局队列。我们将 QoS 传入 global() 方法,实际上就像指定它的优先级。当然你也可以不指定,默认就是 default。

主队列:请避免在主线程指定同步任务,否则你的主线程可能会锁死

3、我们自己创建的队列与系统队列有什么不同?

事实上,我们自己创建的队列,最终会把任务分配到系统提供的主队列和四个全局的并行队列中,这种操作叫做Target queues。具体说,我们创建的串行队列的target queue就是系统的主队列,我们创建的并行队列的target queue默认是系统default优先级的全局并行队列。所有放在我们创建的队列中的任务,最终都会到target queue中完成真正的执行。那岂不是自己创建对列就没什么意义了? 其实不是的,通过我们自己创建的队列,以及dispatch_set_target_queue 和 barrier 等操作,可以实现比较复杂的任务之间的同步。

4、同步和异步添加任务,与队列是串行队列还是并行队列没有关系。可以同步地给并行队列添加任务,也可以异步地给串行队列添加任务。同步和异步添加只影响是不死阻塞当前线程,和任务的串行和并行执行没有关系。

##Dispatch Group

1. group里的任务 串行执行

GCD 在swift中的使用_第1张图片
GCD 在swift中的使用_第2张图片

2. group里的任务并行执行(注意: 1 是在主线程中 而2 是在系统的global线程中)

GCD 在swift中的使用_第3张图片

3. 用wait()监听group中任务执行完毕  在并发执行中不可靠

When usingdispatch_group_asyncto call methods that are, themselves, asynchronous, the group will finish as soon as all of the asynchronous tasks have started, but will not wait for them to finish. Instead, you can manually calldispatch_group_enterbefore you make the asynchronous call, and then calldispatch_group_leavewhen the asynchronous call finish. Thendispatch_group_waitwill now behave as expected.

GCD 在swift中的使用_第4张图片
GCD 在swift中的使用_第5张图片

4. 用enter,leave, notice 方法 监听group中任务执行完毕

GCD 在swift中的使用_第6张图片
GCD 在swift中的使用_第7张图片



你可能感兴趣的:(GCD 在swift中的使用)