王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

GCD 是c语言的框架,不需要手动管理内存

是一个面向任务 不是面向线程,不需要管理线程的生命周期

GCD 任务/队列 执行函数

任务:Block 任务都封闭在Block中。 —— 线程执行

队列:存放任务 FIFO (先进先出的原则)

GCD中的队列:

串行队列:想要任务按顺序执行

// 创建一个串行队列

dispatch_queue_t serialQueue = dispatch_queue_create("serial", DISPATCH_QUEUE_SERIAL);

并发队列:想要任务并发执行(同时执行)

// 创建一个并发队列

dispatch_queue_t concurrentQueue = dispatch_queue_create("concurrent", DISPATCH_QUEUE_CONCURRENT);

两个特殊队列

主队列:主队列中存放的任务最终会交给主线程来执行。

// 获取主队列 不需要创建

dispatch_queue_t mainQueue = dispatch_get_main_queue();

全局并发队列:也是并发队列 没有任何区别。 平常开发用非常多。 (不需要管理 程序需要开多少条线程。 会按照当前的设备来自动开线程

// 获取全局并发队列 不需要创建

// long identifier ios8之前 传线程优先级 DISPATCH_QUEUE_PRIORITY_DEFAULT ios8以后传0 可以兼容之前的版本

// <#unsigned long flags#> 保留接口 还未用 传 0

dispatch_queue_t globalQueue = dispatch_get_global_queue(0, 0);

执行函数: 将队列中的任务放到线程中执行

同步执行函数:不具备开启新线程的能力。任务中会在当前线程执行。

// 同步

dispatch_sync(concurrentQueue, ^{

NSLog(@"下载图片2");

});

同步函数 + 并发队列 和 + 串行队列 效果是一样的

异步执行函数:具备开启新线程能力。 是否开启线程不一定。 与队列有关

// 执行函数

// 异步执行

// dispatch_queue_t queue 队列

// ^(void)block 任务

dispatch_async(serialQueue, ^{

NSLog(@"下载图片");

});

GCD的作用:

1>将任务添加到队列中

2>用执行函数执行任务中的任务

2个执行函数 * 3个队列

同步函数例子1//同步函数 + 串行队列2//不会开启新线程,任务是在当前线程执行.3//如果当前线程是子线程的话,就是在子线程执行4//任务是按顺序执行的5-(void)test16{7dispatch_queue_t serialQueue =dispatch_queue_create(nil, DISPATCH_QUEUE_SERIAL);8//同步函数9dispatch_sync(serialQueue, ^{10//任务11NSLog(@"下载图片1%@",[NSThread currentThread]);12});13//同步函数14dispatch_sync(serialQueue, ^{15//任务16NSLog(@"下载图片2%@",[NSThread currentThread]);17});18//同步函数19dispatch_sync(serialQueue, ^{20//任务21NSLog(@"下载图片3%@",[NSThread currentThread]);22});23}2425//同步函数 + 全局并发队列26//不会开启新线程,在当前线程执行27//如果当前线程是子线程的话,就是在子线程执行28//任务按顺序执行29- (void)test230{31dispatch_queue_t queue = dispatch_get_global_queue(0,0);32dispatch_sync(queue, ^{33NSLog(@"下载图片1%@",[NSThread currentThread]);34});35dispatch_sync(queue, ^{36NSLog(@"下载图片2%@",[NSThread currentThread]);37});38dispatch_sync(queue, ^{39NSLog(@"下载图片3%@",[NSThread currentThread]);40});41}42//对于同步函数 + 串行队列 和 +并发队列 执行效果是一样的.43//同步函数 +主队列44//主队列中的任务都会交给主线程来执行.45//主线程中的任务和主队列中的任务相互等待,无法执行完毕46- (void)test347{48dispatch_sync(dispatch_get_main_queue(), ^{49NSLog(@"下载图片1%@",[NSThread currentThread]);50});51dispatch_sync(dispatch_get_main_queue(), ^{52NSLog(@"下载图片2%@",[NSThread currentThread]);53});54dispatch_sync(dispatch_get_main_queue(), ^{55NSLog(@"下载图片3%@",[NSThread currentThread]);56});57NSLog(@"test3End%@",[NSThread currentThread]);5859}

异步函数例子

1//异步函数 + 主队列2//不会开启新线程3//任务按顺序执行4//不会卡死主线程5dispatch_async(dispatch_get_main_queue(), ^{67NSLog(@"下载图片1%@", [NSThread currentThread]);8});9//异步函数 + 主队列10dispatch_async(dispatch_get_main_queue(), ^{11NSLog(@"下载图片2%@", [NSThread currentThread]);12});13//异步函数 + 主队列14dispatch_async(dispatch_get_main_queue(), ^{15NSLog(@"下载图片3%@", [NSThread currentThread]);16});1718//异步函数 + 串行队列19//开启一条新线程.20//一个队列对应一条线程.每一条线程中的任务都是按顺序执行-- 串行执行.21//如果创建了多个串行队列,会开启多条线程.22- (void)test123{24dispatch_queue_t queue =dispatch_queue_create(nil, DISPATCH_QUEUE_SERIAL);25dispatch_queue_t queue1 =dispatch_queue_create(nil, DISPATCH_QUEUE_SERIAL);26dispatch_async(queue, ^{27NSLog(@"下载图片1%@", [NSThread currentThread]);28});29dispatch_async(queue1, ^{30NSLog(@"下载图片2%@", [NSThread currentThread]);31});3233dispatch_async(queue1, ^{34NSLog(@"下载图片3%@", [NSThread currentThread]);35});3637dispatch_async(queue, ^{38NSLog(@"下载图片4%@", [NSThread currentThread]);39});40}4142//异步函数 + 全局并发队列43//开启一条线程,在子线程中执行任务44//根据任务数量,开启多条线程.45//GCD自动帮我们开启一定数量的线程.46- (void)test247{48dispatch_queue_t queue = dispatch_get_global_queue(0,0);49//异步函数 + 全局并发队列50dispatch_async(queue, ^{51NSLog(@"下载图片1%@",[NSThread currentThread]);52});53//异步函数 + 全局并发队列54dispatch_async(queue, ^{55NSLog(@"下载图片2%@",[NSThread currentThread]);56});57}5859//一次性代码,只会执行一次,能够保证线程安全的.60//线程第一次执行完任务之后,其他线程就不会再进来了.61staticdispatch_once_t onceToken;62dispatch_once(&onceToken, ^{63NSLog(@"%@",[NSThread currentThread]);64NSLog(@"一次性代码,只执行一次%@",string);65});6667//队列组的使用68-(void)groupTest69{70__block UIImage *image1,*image2;71//创建一个队列组72dispatch_group_t group =dispatch_group_create();73//将我们需要执行的任务放在队列中里面74//异步的方法75dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{76//任务177NSLog(@"renwu 1");78image1 = [self downloadImageWithUrlString:@"http://e.hiphotos.baidu.com/zhidao/pic/item/203fb80e7bec54e722c5454ebb389b504fc26ab0.jpg"];79});80//再往队列组中添加一个任务81dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{82//任务283NSLog(@"renwu 2");84image2 = [self downloadImageWithUrlString:@"http://www.cnwan.com.cn/uploads/allimg/2011-07/01002414-1-10j14.jpg"];85});86//队列组中的任务都执行完毕以后,会发送一个通知,执行下面的方法87dispatch_group_notify(group, dispatch_get_main_queue(), ^{88//队列组中的任务执行完毕之后的操作89NSLog(@"renwu over");90//合并图片91self.imageView.image =[self BingImageWith:image1 :image2];92});93}

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航