iOS开发之GCD使用总结

发表于:2014-7-31 10:31

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:肉排君    来源:51Testing软件测试网采编

  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"); });
31/3123>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号