iOS开发之GCD使用总结
作者:网络转载 发布时间:[ 2014/7/31 11:23:47 ] 推荐标签:软件测试 ios
GCD是iOS的一种底层多线程机制,总结一下GCD的常用API和概念,希望对大家的学习起到帮助作用。
GCD队列的概念
在多线程开发当中,程序员只要将想做的事情定义好,并追加到DispatchQueue(派发队列)当中好了。
派发队列分为两种,一种是串行队列(SerialDispatchQueue),一种是并行队列(ConcurrentDispatchQueue)。
一个任务是一个block,比如,将任务添加到队列中的代码是:
1 dispatch_async(queue, block);
当给queue添加多个任务时,如果queue是串行队列,则它们按顺序一个个执行,同时处理的任务只有一个。
当queue是并行队列时,不论第一个任务是否结束,都会立刻开始执行后面的任务,也是可以同时执行多个任务。
但是并行执行的任务数量取决于XNU内核,是不可控的。比如,如果同时执行10个任务,那么10个任务并不是开启10个线程,线程会根据任务执行情况复用,由系统控制。
获取队列
系统提供了两个队列,一个是MainDispatchQueue,一个是GlobalDispatchQueue。
前者会将任务插入主线程的RunLoop当中去执行,所以显然是个串行队列,我们可以使用它来更新UI。
后者则是一个全局的并行队列,有高、默认、低和后台4个优先级。
它们的获取方式如下:
1 dispatch_queue_t queue = dispatch_get_main_queue();
2
3 dispatch queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRORITY_DEFAULT, 0)
执行异步任务
1 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
2 dispatch_async(queue, ^{
3 //...
4 });
这个代码片段直接在子线程里执行了一个任务块。使用GCD方式任务是立即开始执行的
它不像操作队列那样可以手动启动,同样,缺点也是它的不可控性。
令任务只执行一次
1 + (id)shareInstance {
2 static dispatch_once_t onceToken;
3 dispatch_once(&onceToken, ^{
4 _shareInstance = [[self alloc] init];
5 });
6 }
这种只执行一次且线程安全的方式经常出现在单例构造器当中。
任务组
有时候,我们希望多个任务同时(在多个线程里)执行,再他们都完成之后,再执行其他的任务,
于是可以建立一个分组,让多个任务形成一个组,下面的代码在组中多个任务都执行完毕之后再执行后续的任务:
1 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
2 dispatch_group_t group = dispatch_group_create();
3
4 dispatch_group_async(group, queue, ^{ NSLog(@"1"); });
5 dispatch_group_async(group, queue, ^{ NSLog(@"2"); });
6 dispatch_group_async(group, queue, ^{ NSLog(@"3"); });
7 dispatch_group_async(group, queue, ^{ NSLog(@"4"); });
8 dispatch_group_async(group, queue, ^{ NSLog(@"5"); });
9
10 dispatch_group_notify(group, dispatch_get_main_queue(), ^{ NSLog(@"done"); });
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11