首页 > 代码库 > GCD 初步学习
GCD 初步学习
GCD应该是比较牛逼的东西了吧,一时半会应该是操作不好。
在cocoa-china上面有两篇关于GCD的文章,GCD 深入理解(一) GCD 深入理解(二)
CSDN荣芳志博客:点击打开链接
我只是读了第一篇文章,在这对里面讲的几个操作函数做一下记录:
GCD是用来优化程序支持多核处理器和多处理系统的系统,建立在线程池模式上。
原理是:将任务(函数或者block)放入队列,队列(先进先出)有两种:并行和串行;
串行队列-队列中的任务是串行的,运行完一个后接着运行下一个。但是队列与队列之间是并行的
并行队列-队列中的任务是并行的,所以结束的顺序不确定;
系统提供了四个全局并发队列有不同的优先级background、low、default 以及 high
#define DISPATCH_QUEUE_PRIORITY_HIGH 2 #define DISPATCH_QUEUE_PRIORITY_DEFAULT 0 #define DISPATCH_QUEUE_PRIORITY_LOW (-2) #define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN系统还提供给你一个叫做主队列的特殊队列,是一个串行队列,主要用与UI更新;
常用方法:
我们自己可以来创建队列
<span style="font-family:SimSun;font-size:12px;">dispatch_queue_t queue=dispatch_queue_create("queue1", DISPATCH_QUEUE_SERIAL);</span>
第一参数是队列的名字,第二个参数有两种DISPATCH_QUEUE_SERIAL,DISPATCH_QUEUE_CONCURRENT第一个是创建串行队列,第二个是创建并行队列。
dispatch_async
为了避免界面在处理时操作卡死,在另一个线程中执行网络请求等操作,我们可以用dispatch_async来放入另外一个队列中,执行,主线程继续执行UI操作;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // 执行比较耗时的操作 dispatch_async(dispatch_get_main_queue(), ^{ // 更新界面 }); });
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)用来获取一个全局队列,第一个参数是上面4个全局队列中的一个,第二个参数不知道是什么意思,默认填写0就行了。
上面将块中得 操作放入获取到的全局队列中去执行,执行完成再获取主队列来更新ui;
dispatch_group_async
可以监听一组任务是否完成,完成后发送一个通知。
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); //取得一个全局并发队列 dispatch_group_t group = dispatch_group_create(); //创建一个运任务组 dispatch_group_async(group, queue, ^{ [NSThread sleepForTimeInterval:1]; //延迟一秒钟 NSLog(@"group1"); });
//向组中添加任务
dispatch_group_async(group, queue, ^{ [NSThread sleepForTimeInterval:2]; //延迟两秒钟 NSLog(@"group2"); }); <pre name="code" class="objc" style="color: rgb(120, 73, 42); font-size: 11px;">//向组中添加任务dispatch_group_async(group, queue, ^{ [NSThread sleepForTimeInterval:3]; //延迟三秒钟 NSLog(@"group3"); });
//向组中添加任务dispatch_group_notify(group, dispatch_get_main_queue(), ^{ NSLog(@"updateUi"); }); //组中所有任务完成后发出通知dispatch_release(group); 最后取消任务组
dispatch_barrier_async
在一个队列中等到前面的任务结束后才执行,在执行此任务时保持串行(也就是执行完此任务的所有内容后其他恢复原队列的执行状态);
dispatch_queue_t queue = dispatch_queue_create("gcdtest.rongfzh.yc", DISPATCH_QUEUE_CONCURRENT); dispatch_async(queue, ^{ [NSThread sleepForTimeInterval:2]; NSLog(@"dispatch_async1"); }); dispatch_async(queue, ^{ [NSThread sleepForTimeInterval:4]; NSLog(@"dispatch_async2"); });
//下面是锁 dispatch_barrier_async(queue, ^{ NSLog(@"dispatch_barrier_async"); [NSThread sleepForTimeInterval:4]; }); dispatch_async(queue, ^{ [NSThread sleepForTimeInterval:1]; NSLog(@"dispatch_async3"); });
GCD 初步学习
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。