ios知识积累iOS多线程iOS点点滴滴

ios - GCD (1)

2015-01-19  本文已影响268人  小桃桃

1.什么是GCD?

GCD (Grand Central Dispatch) 是异步执行任务的技术之一,以非常简洁的语法实现了复杂繁琐的多线程编程。

使用GCD的语法如下:

dispatch_async(queue, ^{

  //在后台 执行耗时的操作处理,处理完毕后调用主线程更新用户界面

  dispatch_async(dispatch_get_main_queue(), ^{

      //主线程同步,例如更新用户界面

   });

});


2.Dispatch_Queue

GCD中有2种类型队列,Serial Dispatch Queue 和 ConcurrentDispatch Queue。

1) Serial Dispatch Queue

串行队列,按照任务顺序执行处理,在同一时间执行一个任务,如下图:

串行队列工作模式

Serial Dispatch Queue 不使用锁,可以解决多线程中 “数据竞争”的问题,如下图:

数据竞争问题

iOS 中的UI主线程队列 是Serial Dispatch Queue 类型,创建一个Serial Dispatch Queue时,系统会为此队列创建一个线程,比如创建5个Serial Dispatch Queue此时系统就会创建5个线程,过多的创建会消耗大量内存,引起大量上下文切换,大幅降低系统相应性能。

2) Concurrent Dispatch Queue

并行队列,队列中执行的任务顺序是不固定的,如下图:

并行队列工作模式

Concurrent Disaptch Queue 使用XNU内核来管理线程,不会发生Serial Dispatch Queue的问题。如果操作中不存在"数据竞争" 问题,请使用Concurrent Dispatch Queue。

3.创建队列

1) 使用dispatch_queue_create

创建Serial Dispatch Queue

dispatch_queue_t mySerialDispatchQueue = dispatch_queue_create("queue identity", nil);

创建Concurrent Dispatch Queue

dispatch_queue_t myConcurrentDispatchQueue = dispatch_queue_create("queue identity", DISPATCH_QUEUE_CONCURRENT);

参数1 :队列的标示(建议identity定义的规范,在输出错误日志调试时非常有用)

参数2: 队列类型,nil 代表 Serial 队列 , DISPATCH_QUEUE_CONCURRENT代表 Concurrent 队列

*具体信息可查阅苹果官方的帮助文档

2) 使用系统标准提供的 Dispatch Queue 来创建

dispatch_get_global_queue()

dispatch_get_main_queue()

上一篇下一篇

猜你喜欢

热点阅读