我的码农生涯iOS开发技术分享

GCD 重温“共产党”之路

2017-03-30  本文已影响34人  明天就去

依稀记得刚接触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(@"只会执行一次");

});

网上的教程一大堆,我就不在这里献丑了 ,关键是我工作了这么长时间,用的真不怎么多,就当是自己做的一个笔记吧。

上一篇下一篇

猜你喜欢

热点阅读