GCD Queue 的划分
The main queue :主队列,主线程就是在个队列中,是串行队列,
dispatch_get_main_queue()
。Global queues : 全局并发队列,
dispatch_get_global_queue(0, 0)
。用户队列:是用函数 dispatch_queue_create 创建的自定义队列
dispatch_sync 和 dispatch_async 区别
dispatch_async(queue,block) async 异步队列,dispatch_async 函数会立即返回, block会在后台异步执行。
dispatch_sync(queue,block) sync 同步队列,dispatch_sync 函数不会立即返回,及阻塞当前线程,等待 block同步执行完成。
非典型案例一
- (void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"=================4");
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"=================5");
});
NSLog(@"=================6");
}
解析
dispatch_sync会阻塞当前进程等待里面的block执行完毕,dispatch_get_main_queue会获取当前主线程,而当前主线程不会,正在串行执行的主线程突然加入一个并发,造成死锁
解决方法
- (void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"=================4");
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"=================5");
});
NSLog(@"=================6");
}
dispatch_async不会立即执行block里面方法,等到主线程执行完了,这时候拿到主线程去NSLog(@"=================5");
非典型案例二
- (void)viewDidLoad
{
[super viewDidLoad];
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSLog(@"=================1");
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"=================2");
});
NSLog(@"=================3");
});
}
解析
dispatch_async不会立即执行block里面方法,等到主线程执行完了,拿到全局队列,同步执行主线程,就不会死锁