GCD简介(Grand Central Dispatch)
GCD是纯C语言,提供了非常多的强大函数
GCD是非常高效的多线程开发方式,它并不是Cocoa框架的一部分
GCD优势
1.GCD是苹果公司为多核的并行运算提出的解决方案
2.GCD会自动利用更多的CPU内核(比如双核、四核)
3.GCD会自动管理线程的生命周期(创建线程、调度任务、销毁线程)
4.开发者只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码【总结】:GCD就是将任务添加到队列,并且指定执行任务的函数。
GCD使用 (GCD的核心就是dispatch队列任务)
1.定义任务
2.将任务添加到队列中
GCD队列
1.主线程队列 (提交的任务将会在主线程完成)
- 可以通过dispatch_get_main_queue获得
-
主队列就是主线程,它是一个串行队列,在iOS中只有主线程才能拥有权限向渲染服务提交图层信息,完成图形显示工作。所以和UI相关操作,必须在主线程执行
2.全局并发队列(Gobal queue) 全局并发队列由整个进程共享,有高,中(默认),低,后台四个优先级
3.自定义队列
· 并发队列
- 全局队列是并发队列
- 通过dispatch_queue_create创建,第二个参数是DISPATCH_QUEUE_CONCURRENT等
- 不用等待上个任务是否完成,直接启用新的线程执行新的任务。
· 串行队列:
- 通过dispatch_queue_create创建,第二个参数赋值为DISPATCH_QUEUE_SERIAL或者NULL。
- 串行队列在同一时间只能执行一个任务 整体如下图所示:
GCD任务
GCD任务就是操作的意思,就是在block块中的代码通过什么方式执行。执行任务有两种方式:同步和异步,两者主要区别是:是否等待队列的任务执行结束,以及是否具备开辟线程的能力。
同步执行(sync)
- 1.同步添加任务到指定的队列中,在添加的任务执行结束之前,会一直等待,直到队列里面的任务完成之后再继续执行。
- 2.只能在当前线程中执行任务,不具备开启新线程的能力。
异步执行 (async)
- 1.异步添加任务到指定的队列中,它不会做任何等待,可以继续执行任务。
- 2.可以在新的线程中执行任务,具备开启新线程的能力。
GCD的基本写法:
//还原基础写法
- (void)syncTest{
dispatch_block_t block = ^{
NSLog(@"hello GCD");
};
//串行队列
dispatch_queue_t queue = dispatch_queue_create(@"com.hm.cn", NULL);
//函数
dispatch_async(queue, block);
}
下面再将队列和任务搭配执行看打印结果:
/**
同步并发
*/
- (void)concurrentSyncTest{
dispatch_queue_t queue = dispatch_queue_create("HM", DISPATCH_QUEUE_CONCURRENT);
for (int i = 0; i < 10 ; i++){
dispatch_sync(queue, ^{
NSLog(@"同步并发-%d-%@", i , [NSThread currentThread]);
});
}
}
网友评论