iOS之同步异步串行并行
示例
dispatch_queue_t serial_queue = dispatch_queue_create(“串行队列”, DISPATCH_QUEUE_SERIAL);
dispatch_queue_t concurrent_queue = dispatch_queue_create(“串行队列”, DISPATCH_QUEUE_CONCURRENT);
NSLog(@“serial_queue == %@”, serial_queue);
NSLog(@“concurrent_queue == %@”, concurrent_queue);
NSLog(@“1”);
[self getCurrentThread];
// 同步 x 串行
// 1. 主队列 => 死锁
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@“同步 x 串行 - block”);
});
// 2. 普通串行队列
dispatch_sync(serial_queue, ^{
NSLog(@“2”);
[self getCurrentThread];// main
});
// 同步 x 并行
dispatch_sync(serial_queue, ^{
NSLog(@“3”);
[self getCurrentThread];// main
});
// 结论:主线程中,任务放到其他队列(并行、串行均可)同步执行,会顺序执行,执行完放入的任务,再继续向下执行主队列的任务,不会死锁。
// 异步 x 串行
// 1. 主队列
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@“4”);// 在6后输出
[self getCurrentThread];// main(main_queue只能派发到主线程?)
});
// 2. 普通串行队列
dispatch_async(serial_queue, ^{
NSLog(@“5”);
[self getCurrentThread]; // (null)
});
// 异步 x 并行
dispatch_async(concurrent_queue, ^{
NSLog(@“6”);// 在7后输出
[self getCurrentThread]; // (null)
});
NSLog(@“7”);
// 1 2 3 7 5
// 6 4
总结
同步、异步
同步和异步是站在当前线程的角度,考察添加任务到新线程后,何时返回到当前线程执行下面的代码的问题,也即新添加的线程阻不阻塞当前线程。
- 本文链接:http://katherineleeyq.cn/2019/08/02/iOS之同步异步串行并行/
- 版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 CN 许可协议。转载请注明出处!