iOS中所支持的多线程编程方法有三种:NSThread、NSOperation&NSoperationQueue、GCD,其中GCD是苹果官方所推荐使用的。
GCD全称Grand Central Dispatch(队列调度),是一套底层API,提供了一种新的方法来进行并发程序编写。从基本功能上讲,GCD类似NSOperationQueue,都是允许程序将任务切分为多个单一任务,然后提交至工程队列来并发地(串行)执行。
GCD是C语言的实现,比NSoperationQueue更底层、更高效,并且它不是Cocoa框架的组成部分,并发任务会想NSoperationQueue那样基于系统负载来合适地并发进行,串行队列同一时间只执行单一任务,GCD的API很大程度上基于block。
GCD的三种队列任务
1.主线程队列
主线程队列, 内部执行任务是串行的同步操作。
主线程队列不需要我们创建,通过dispatch_get_main_queue()方法获得
dispatch_queue_t queue = dispatch_get_main_queue();
dispatch_async(queue, ^{
[self taskThread1];
});
或者
dispatch_async(dispatch_get_main_queue(), ^{
[self taskThread2];
});
2.创建私有队列 用户队列/串行队列
使用C接口,创建一个私有队列,队列名是一个C字符串,没有特别的要求,官方建议用倒装的标示符来表示(多用于调试)
私有队列内部也是串行操作
dispatch_queue_t queue = dispatch_queue_create("com.qianfeng", NULL);
dispatch_async(queue, ^{
[self taskThread2];
});
// 我们自己创建的队列,非ARC下,我们需要自己销毁
//dispatch_release(queue);
3.全局队列
全局队列是并行队列,不需要手动创建,可以通过dispatch_get_global_queue()方法获得
// 第一个参数是选取按个全局队列,一般采用DEFAULT,默认优先级队列
// 第二个参数是保留标志,目前的版本没有任何用处(不代表以后版本),直接设置为0就可以了
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
在全局队列里增加占用时间很长的block时,例如数据下载,文件操作,数据库操作等。需要在主队列中刷新UI(任何情况下刷新UI,务必在主线程中进行)