GCD 中的常用函数
一. 什么是GCD
Grand Central Dispatch 简称(GCD)是苹果公司开发的异步执行技术之一,以优化的应用程序支持多核心处理器和其他的对称多处理系统的系统。这建立在任务并行执行的线程池模式的基础上的。
二. 常用函数的整理
- (void)viewDidLoad {
[super viewDidLoad];
#pragma mark - 导入GCD之前的简单多线程技术
/*
* NSObject performSelectorInBackground: withObject: 方法
* 执行后台线程
*/
[self performSelectorInBackground:@selector(doSomething) withObject:nil];
#pragma mark - GCD技术多线程的一般方法
dispatch_queue_t queue = dispatch_queue_create("XXXX", NULL);
/*
* 异步执行 dispatch_async
* 同步执行 dispatch_sync
*/
dispatch_async(queue, ^{
/*
* 需要长时间处理的任务
* 例如AR画像识别
* 例如数据库访问
* TODO:---------
*/
/*
* 长时间处理结束,主线程使用其处理结果
*/
dispatch_async(dispatch_get_main_queue(), ^{
/*
* 只在主线程可以的处理
* 例如用户界面更新
*/
});
});
#pragma mark - GCD队列获得方法
// 第一种方法
// 开发者要做的只是定义想执行的任务并追加到合适的Dispatch Queue
dispatch_async(queue, ^{
/*
* 想执行的任务
*/
});
// 生成Serial Dispatch Queue 的方法(串行队列)
dispatch_queue_t serialQueue = dispatch_queue_create("XXXXX", NULL);
// 生成Concurrent Dispatch Queue 的方法 (并行队列)
dispatch_queue_t conCurrentQueue = dispatch_queue_create("com.ideal.gcd", DISPATCH_QUEUE_CONCURRENT);
// 启动创建的队列
dispatch_async(serialQueue, ^{
/*
* 想执行的任务
*/
});
dispatch_async(conCurrentQueue, ^{
/*
* 想执行的任务
*/
});
/*
* 在非ARC的情况下,需要释放创建的队列。
dispatch_release(queue);
dispatch_release(serialQueue);
dispatch_release(conCurrentQueue);
*/
// 第二种方法
// 获得系统提供的标准 Dispatch Queue
/*
Main Dispatch Queue :
主线程只有一个,因此Main Dispatch Queue 是Serial Dispatch Queue。
Global Dispatch Queue :
全局队列,是所有应用程序都能使用的Concurrent Dispatch Queue,因此没必要生成并行队列,只需获取系统的就可以了。
*/
// 系统提供Dispatch Queue 的获取方法
// Main Dispatch Queue :
dispatch_queue_t mainDispatchQueue = dispatch_get_main_queue();
// Global Dispatch Queue :
// 最高优先级:
dispatch_queue_t globalQueueHigh = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
// 默认优先级:
dispatch_queue_t globalQueueDefault = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// 低优先级:
dispatch_queue_t globalQueueLow = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);
// 后台优先级:
dispatch_queue_t globalQueueBackground = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
// 启动创建的队列
dispatch_async(mainDispatchQueue, ^{
/*
* 只能在主线程执行的任务
*/
});
dispatch_async(globalQueueHigh, ^{
/*
* 可并行执行的任务