一什么是GCD :(Grand [伟大] Central [中央] Dispatch[调度])xcode
GCD又名“伟大的中央调度器”,他是iOS4后才引进的一种多线程技术。开发者只需定义想执行的任务兵追加到Dispatch Queue(调度队列)中。GCD就能生成必要的线程并有计划的执行任务。GCD的实质其实就是队列。多线程
二GCD的优点并发
1.GCD的出现解决了多核并行运算的问题异步
2.GCD自动管理线程的生命周期async
3.只需描写任务,无需编写任何线程管理的代码spa
注:由dispatch_queue_create方法生成的Dispatch Queue并不能由ARC来自动管理内存。能够使用dispatch_release、dispatch_retain来手动管理(引用计数式),但在目前看来,所用的OSX-10.8 开启的ARC已经不须要再用dispatch_release()来作管理线程
三GCD的遵循的规则调试
GCD中任务的取出遵循队列的FIFO原则:先进先出,后进后出。code
四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:
见下一篇。