GCD的三种队列类型
GCD的核心是dispatch队列。dispatch Block的执行最终会放到某个队列中去。
1. The main queen (主线程串行队列)。通过 dispatch_get_main_queen()获取。
2.Global queen (全局并发队列),通过dispatch_get_global_queen()获取。全局并发队列由全局共享,可以设置高、中、低、后台四个优先级。
3.Custom queen (自定义队列)可以串行,也可以并发。通过dispatch_queen_create()获取。
4.Group queen(队列组),将多线程分组,最大的好处获知所有线程的执行情况。通过dispatch_group_create()获取。通过dispatch_group_notify监听线程的执行情况。
dispatch_sync同步执行任务函数,不会开启新的线程。dispatch_async异步执行任务函数,会开启新的线程。
1.在主线程串行队列中执行同步任务会造成线程死锁, block中的任务永远不会执行。因为dispatch_sync这个函数返回的时候主线程才会往下执行,但这个函数的返回条件是里面的block返回,因为它被插到到了主线程串行队列最后执行,所以dispatch_sync无法返回,主线程串行队列不会执行到最后一个,产生死锁。
dispatch_sync(mainQueen,^){
Nslog(@"mainQueen");
}
2.主线程串行队列中执行异步执行任务不会造成死锁。
dispatch_async(mainQueen,^){
Nslog(@"mainQueen");
}
3.从子线程异步返回主线程更新UI,使用方式最多
dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(globalQueue, ^{
//子线程异步执行下载任务,防止主线程卡顿
NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];
NSError *error;
NSString *htmlData = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];
if (htmlData != nil) {
dispatch_queue_t mainQueue = dispatch_get_main_queue();
//异步返回主线程,根据获取的数据,更新UI
dispatch_async(mainQueue, ^{
NSLog(@"根据更新UI界面");
});
} else {
NSLog(@"error when download:%@",error);
}
});
主线程串行队列由系统默认生成,无法使用dispatch_resume()和diapatch_suspend()来控制执行继续或者中断。
Global Queen(全局并发线程),耗时操作,例如读取网络数据、数据库读写、IO等。我们会在另一个线程中执行此操作,然后通知主线程刷新UI。
1.全局并发队列同步执行任务,在主线程中执行会导致页面卡顿。
dispatch_sync(globalQueen,^){
Nslog(@"globalQueen");
}
block中的代码2s后才会执行。
2.全局并发队列异步执行任务,在主线程中执行不会造成页面卡顿。
dispatch_async(globalQueen,^){
Nslog(@"globalQueen");
}
3.多个全局并发队列,异步执行任务
dispatch_async(globalQueen,^){
Nslog(@"老大");
}
dispatch_async(globalQueen,^){
Nslog(@"老二");
}
异步线程的执行顺序是不确定的。几乎同步开始执行
全局并发队列由系统默认生成的,所以无法调用dispatch_resume()和dispatch_suspend()来控制执行继续或中断。