一什么是GCD :(Grand [伟大] Central [*] Dispatch[调度])
GCD又名“伟大的*调度器”,他是iOS4后才引进的一种多线程技术。开发者只需定义想执行的任务兵追加到Dispatch Queue(调度队列)中。GCD就能生成必要的线程并有计划的执行任务。GCD的实质其实就是队列。
二GCD的优势
1.GCD的出现解决了多核并行运算的问题
2.GCD自动管理线程的生命周期
3.只需描写任务,无需编写任何线程管理的代码
注:由dispatch_queue_create方法生成的Dispatch Queue并不能由ARC来自动管理内存。可以使用dispatch_release、dispatch_retain来手动管理(引用计数式),但在目前看来,所用的OSX-10.8 开启的ARC已经不需要再用dispatch_release()来做管理
三GCD的遵循的规则
GCD中任务的取出遵循队列的FIFO原则:先进先出,后进后出。
四GCD执行任务的方式
创建串行队列
dispatch_queue_t queue = dispatch_queue_create("first" , DISPATCH_QUEUE_SERIAL); DISPATCH_QUEUE_SERIAL被系统默认为NULL,他是串行队列的标示符
1.串行队列同步执行:dispatch_sync(queue, ^{ NSLog(@"1"); }); 关键词sync表示同步
串行队列同步执行:不会开辟线程,按顺序逐步执行(即会耗费内存,又无加快程序运行速度,基本上毫无意义)。
2.串行队列异步执行:dispatch_async(queue, ^{ NSLog(@"1"); }); 关键词async表示异步
串行队列异步执行: 会开辟线程,队列内的任务会逐步执行,线程内的任务与线程外的任务并发执行(很有用)。
创建并行队列
dispatch_queue_t queue = dispatch_queue_create("second" , DISPATCH_QUEUE_SERIAL); DISPATCH_QUEUE_SERIAL是并行队列的标志
3.并行队列同步执行:dispatch_sync(queue, ^{ NSLog(@"1"); }); 关键词sync表示同步
并行队列同步执行:不会开辟线程,按照顺序执行。(基本上没有用)。
4.并行队列异步执行:dispatch_async(queue, ^{ NSLog(@"1"); }); 关键词async表示异步
并行队列异步执行: 会开辟多个线程,线程的多少由GCD底层决定。对列的任务会同步执行(无法确定队列内任务的执行顺序,易出错)。
总结:同步执行的队列不会开辟线程,异步会开辟线程
四.GCD中的两个特殊队列
1.主队列:放到主队列中的任务,都会放到主线程中执行。
使用dispatch_get_main_queue()获得主队列
dispatch_queue_t queue = dispatch_get_main_queue();
每一个应用程序只有一个主线程即只有一个主队列,主队列中的操作都是在主线程中执行的,不存在异步的概念。
注:主队列中添加的同步操作永远不会被执行(会死锁)
2.全局队列的生成
ispatch_async(dispatch_get_global_queue(0, 0), ^{ })
全局队列:全局队列是系统的,直接拿过来就可以用,与并行队列类似,但是不能指定队列的名字,调试时无法确认任务所在队列
在全局队列中执行同步任务:不会新建线程,按顺序执行任务
在全局队列中执行异步任务:会新建多个线程,但是无法确定任务的执行顺序
3.全局并发队列的优先级:
#define DISPATCH_QUEUE_PRIORITY_HIGH 2 // 高
#define DISPATCH_QUEUE_PRIORITY_DEFAULT 0 // 默认(中)
#define DISPATCH_QUEUE_PRIORITY_LOW (-2) // 低
#define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN // 后台
DEMO:
见下一篇。