GCD:Grand Central Dispatch(GCD) 是异步执行任务的技术之一。一般将应用程序中记述的线程管理用的代码在系统级中实现。开发者只需要定义想执行的任务并追加到适当的Dispatch Queue中,GCD就能生成必要的线程并计划执行任务。由于线程管理是作为系统的一部分来实现的,因此可以统一管理,也可执行任务,这样就比以前的线程更有效率。
1 Dispatch Queue
“Dispatch Queue”是什么,如其名称所示,是执行处理的等待队列。Dispatch Queue 按照追加的顺序执行处理。先进先出FIFO,first-in-first-out。
队列类型:
1 Serial Dispatch Queue 等待现在执行处理结束
2 Concurrent Dispatch Queue 不等待现在执行处理结束
比较两种Dispatch Queue。
dispatch_sync(queue,block1);
dispatch_sync(queue,block2);
dispatch_sync(queue,block3);
dispatch_sync(queue,block4);
dispatch_sync(queue,block5);
dispatch_sync(queue,block6);
当queue为serial Dispatch Queue,会先执行block1,当block1执行完毕后,接着执行block2,当block2执行完毕后,接着执行block3,如此重复。同时执行的处理数只能有一个。
block1 -> block2-> block3-> block4-> block5-> block6
当queue为Concurrent Dispatch Queue时,首先执行block1,不管block1是否结束,都开始执行后面的block2,不管block2是否结束,都开始执行block3,如此重复循环。(同时执行的处理数量取决于当前系统的状态。)
线程1 | 线程2 | 线程3 |
block1 | block2 | block3 |
block4 | block6 | block5 |
创建方式
第一种方式:dispatch_queue_create
// 创建串行队列 <span style="font-family: Arial, Helvetica, sans-serif;">DISPATCH_QUEUE_SERIAL = NULL</span>
dispatch_queue_t queue = dispatch_queue_create("com.baidu.queue", DISPATCH_QUEUE_SERIAL);
// 1.创建一个并发队列
dispatch_queue_t queue = dispatch_queue_create("com.baidu.queue", DISPATCH_QUEUE_CONCURRENT);
虽然Serial Dispatch Queue 和Current Dispatch Queue将受到限制,但是使用dispatch_queue_create函数可生成人意多个Dispatch Queue。
当生成多个Serial Dispatch Queue时,虽然在一个Serial Dispatch Queue中同时只能执行一个追加处理,但多个Serial Dispatch Queue之间可以并行执行。
通过dispatch_queue_create 函数生成的Dispatch Queue,在使用结束后需要释放。
//释放
dispatch_release(queue);
第二种方式:获取系统标准提供的Dispatch Queue。
Main Dispatch Queue,是在主线程中执行的Dispatch Queue,属于Serial Dispatch Queue。
// 1.获得主队列
dispatch_queue_t mainQueue = dispatch_get_main_queue();
追加到Main Dispatch Queue的处理在主线程的RunLoop中执行。因此要将用户界面的更新等一些必须在主线程中执行的处理追加到Main Dispatch Queue使用。与NSObject类的persormSelectorOnMainThread实例方法相同。
Global Dispatch Queue是ConCurrent Dispatch Queue。所有应用程序都可以使用,没有必要通过dispatch_queue_create函数逐个生成Concurrent Dispatch Queue。
// 1.获得全局的并发队列
dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
第一个参数表示优先级。Global Dispatch Queue有4个执行优先级,分别是:
#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
2 执行任务方式
GCD有两种方法执行任务。