GCD:Grand Central Dispatch强大的中枢调节器
GCD:1.基于底层C语言的API接口
2.定义用block任务
3.提供更多的控制能力以及操作队列所不能完成的执行任务的能力
GCD优点:1.有自动调用多核(CPU)的能力
2.会自动管理线程的生命周期(创建线程,分配任务,销毁线程)
队列:串行队列,并行队列,主队列,全局队列(全局并发队列),组队列
操作:同步(不开辟新的线程),异步(开辟新的线程)
1.串行队列+同步:不开辟新线程,操作按顺序执行
创建队列: dispatch_queue_t 队列名 = dispatch_queue_create(队列名称,NULL);
往队列中添加任务:(可添加多个任务)
dispatch_sync(队列名, ^{
执行的任务;
});
2.串行队列+异步:开辟新线程,操作按顺序执行
创建队列: dispatch_queue_t 队列名 = dispatch_queue_create(队列名称,NULL);
往队列中添加任务:(可添加多个任务)
dispatch_async(队列名, ^{
执行的任务;
});
3.并行队列+同步:不开辟新线程,操作按顺序执行
创建队列: dispatch_queue_t 队列名 = dispatch_queue_create(队列名称,DISPATCH_QUEUE_CONCURRENT);
往队列中添加任务:(可添加多个任务)
dispatch_sync(队列名, ^{
执行的任务;
});
4.并行队列+异步:开辟新线程,操作不按顺序执行
创建队列: dispatch_queue_t 队列名 = dispatch_queue_create(队列名称,DISPATCH_QUEUE_CONCURRENT);
往队列中添加任务:(可添加多个任务)
dispatch_async(队列名, ^{
执行的任务;
});
5.主队列:在主线程中执行任务的队列(系统提供)
dispatch_async(dispatch_get_main_queue(), ^{
执行的任务;
});
6.全局队列+同步:不开辟新线程,操作按顺序执行(系统提供);可以设置队列的优先级
创建队列: dispatch_queue_t 队列名 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
往队列中添加任务:(可添加多个任务)
dispatch_sync(队列名, ^{
执行的任务;
});
7.全局队列+异步:开辟新线程,操作不按顺序执行(系统提供);可以设置队列的优先级
创建队列: dispatch_queue_t 队列名 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
往队列中添加任务:(可添加多个任务)
dispatch_async(队列名, ^{
执行的任务;
});
8.组队列:各个队列组成(异步执行),操作没有按顺序执行,最后执行的操作放到dispatch_group_notify中
创建组队列:dispatch_group_t 组队列名 = dispatch_group_create();
创建队列:
dispatch_queue_t 队列名1 = dispatch_queue_create(,);
dispatch_queue_t 队列名2 = dispatch_queue_create(,);
dispatch_queue_t 队列名3 = dispatch_queue_create(,);
......可添加多个队列
选择在组队列中的某个子队列上执行操作
dispatch_group_async(组队列名, 队列名?, ^{
执行的任务;
});
......可添加多个任务
组队列执行的最后一个操作:
dispatch_group_notify(组队列名,队列名?, ^{
执行的任务;
});
组队列可创建延迟执行:
创建休眠队列时间
dispatch_time_t 时间名 = dispatch_time(DISPATCH_TIME_NOW,n*NSEC_PER_SEC);
组队列休眠
dispatch_group_wait(组队列名, 时间名);
dispatch_once:用于检测该代码是否已经被调度,调度过的,不会往下执行代码,没被调度的才会执行以下代码
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
执行的代码;
});
dispatch_semaphore_t:信号量,是GCD用来同步的一种方式,在信号量满足的情况下,操作任务一个个按顺序完成,若信号量为0是,则不会执行,线程阻塞;
创建信号量:
dispatch_semaphore_t 信号量名 = dispatch_semaphore_create(初始量);
增加信号量:
dispatch_semaphore_signal(信号量名);
减少信号量:
dispatch_semaphore_wait(信号量名, DISPATCH_TIME_FOREVER);
MRC下释放队列:dispatch_release(队列名)