GCD线程学习小结

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()来控制执行继续或中断。

你可能感兴趣的:(GCD线程学习小结)