1 queue
1.1 自定义队列
串行队列:队列中的任务只会顺序执行
dispatch_queue_t q = dispatch_queue_create("...", DISPATCH_QUEUE_SERIAL);
dispatch_queue_t q = dispatch_queue_create("...", NULL);
复制代码
并行队列: 队列中的任务通常会并发执行
dispatch_queue_t q = dispatch_queue_create("......",DISPATCH_QUEUE_CONCURRENT);
复制代码
1.2 系统标准队列
全局队列:是系统的,直接GET。并行
dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
复制代码
主队列:每一个应用程序对应唯一主队列,直接GET。串行
主队列
只会运行在主线程上,使用主队列更新UI。 主线程
可以执行其他队列的任务。
dispatch_queue_t q = dispatch_get_main_queue();
复制代码
2 同步、异步,针对的是向前线程
dispatch_sync(_queue, ^() {
//...
}
复制代码
3 dispatch_group
Case: 有a、b、c、d 4个异步请求,如何判断a、b、c、d都完成执行?如果需要a、b、c、d顺序执行,该如何实现?
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, queue, ^{ /*任务a */ });
dispatch_group_async(group, queue, ^{ /*任务b */ });
dispatch_group_async(group, queue, ^{ /*任务c */ });
dispatch_group_async(group, queue, ^{ /*任务d */ });
//先提交,再用notify或者wait
dispatch_group_notify(group,dispatch_get_main_queue(), ^{
// 在a、b、c、d异步执行完成后,会回调这里
});
//dispatch_group_wait(_loggingGroup, DISPATCH_TIME_FOREVER);
复制代码
顺序执行,queue用串行队列。
4 dispatch_barrier_async
- 在同一个queue(哪怕是并行队列)里面,执行顺序:barrier之前的任务、barrier任务、barrier之后的任务。
- 只在自定义队列上有效,在系统标准队列上,效果等同于dispatch_sync。
//不使用barrier时
dispatch_queue_t queue = dispatch_queue_create("queue_name", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
NSLog(@"----耗时任务1-----%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"----耗时任务2-----%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"----耗时任务3-----%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"----耗时任务4-----%@", [NSThread currentThread]);
});
复制代码
dispatch_queue_t queue = dispatch_queue_create("queue_name", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
NSLog(@"----耗时任务1-----%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"----耗时任务2-----%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"----耗时任务3-----%@", [NSThread currentThread]);
});
dispatch_barrier_async(queue, ^{
NSLog(@"----barrier-----%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"----耗时任务4-----%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"----耗时任务5-----%@", [NSThread currentThread]);
});
复制代码
5 dispatch_time
比NSTimer更精准
dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC));
//dispatch_time的第二个参数的单位是纳秒
#define NSEC_PER_SEC 1000000000ull //每秒的纳秒数
复制代码
6 对比NSOperationQueue
6.1 NSOperationQueue与GCD之间的关系
GCD是纯C语言的API 。 NSOperationQueue是基于GCD的OC的封装。
6.2 两者的不同
- GCD只支持FIFO队列,NSOperationQueue可以重新设置优先级,最大并发数。
- NSOperationQueue可是方便设置operation之间的依赖关系,GCD则需要很多代码。
- NSOperationQueue支持KVO,即可以观察任务的执行状态,正在执行(isExecuted),是否结束(isFinished),是否取消(isCanceled)。
6.3 结论
- GCD更接近底层,而NSOperationQueue则更高级抽象。
- GCD速度更快。
- 任务之间的依赖关系。GCD需要自己写更多的代码来实现,而NSOperationQueue已经内建了这些支持。