GCD 重温“共产党”之路
依稀记得刚接触OC的时候,就听老师在讲台上不停的重复共产党,说这东西很重要,一定要掌握。但是知道现在(一年后)干了这么长时间的iOS,竟然没有深入的研究过GCD,倍感惭愧。更奇葩的是这么长时间,竟然没有多少次用到过,也是很醉,趁着有时间,研究一下,就当是做一个笔记吧
一、作用
由于接触的比较浅,我对GCD的主要功能理解就是:为了避免界面在处理耗时的操作时卡死,比如读取网络数据,IO,对数据库的读写等,我们会在另外一个线程中处理这些操作,然后通知主线程更新界面。(菜鸟阶段,只能用到这些,若有一日进阶大神阶段,再来更新0.o)
二、CGD的名词:
并发队列:队列中的任务并发执行dispatch_queue_tqueue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);//并行队列
串行队列:队列中的任务顺序执行 dispatch_queue_tqueue =dispatch_queue_create("getImage",DISPATCH_QUEUE_SERIAL);//串行队列
异步执行任务:dispatch_async(具备开线程能力)
同步执行任务:dispatch_sync (只在当前线程中执行任务,不具备开线程的能 力)
使用情况:
① 串行队列+异步函数==可开线程顺序执行任务
dispatch_queue_tqueue=dispatch_queue_create("getImage",DISPATCH_QUEUE_SERIAL);//串行队列dispatch_async(queue, ^{//异步函数
NSURL*imageUrl = [NSURLURLWithString:@"http://ac-nxp0vq41.clouddn.com/bb442f837f0c809e7c89.jpg"];
UIImage*image = [UIImageimageWithData:[NSDatadataWithContentsOfURL:imageUrl]];
NSLog(@"image:%@",image);
});
②串行队列 + 同步函数 == 可开线程并发执行任务
③并发队列 + 异步函数 == 不能开线程
④并发队列 + 同步函数 == 不能开线程
三、具体使用实例
1、有a、b、c、d 4个异步请求,需要a、b、c、d顺序执行,请求完成后进行数据处理
dispatch_queue_tqueue =dispatch_queue_create("getImage",DISPATCH_QUEUE_CONCURRENT);//串行队列
dispatch_group_tgroup =dispatch_group_create();
dispatch_group_async(group, queue, ^{
//任务1
NSLog(@"queue:1");
});
dispatch_group_async(group, queue, ^{
//任务2
NSLog(@"queue:2");
});
dispatch_group_async(group, queue, ^{
//任务3
NSLog(@"queue:3");
});
dispatch_group_notify(group,dispatch_get_main_queue(), ^{//显示图片
//任务123顺序执行完成之后,会回调此Block
});
2、延时功能
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)delay*NSEC_PER_SEC),dispatch_get_main_queue(), ^{
//延迟结束后执行的操作
});
3、一次性函数
staticdispatch_once_tonceToken;
dispatch_once(&onceToken, ^{
NSLog(@"只会执行一次");
});
网上的教程一大堆,我就不在这里献丑了 ,关键是我工作了这么长时间,用的真不怎么多,就当是自己做的一个笔记吧。