仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3519|回复: 20
打印 上一主题 下一主题

[学习教程] IOS制作之iOS多线程编程之Grand Central Dispatch(GCD)先容和利用仓酷云

[复制链接]
透明 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:30:22 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
很少去思考,没有去多问几个为什么。这是学习的大忌,我认识到了自己学习方法上的错误。孔子说,学而不思则罔,思而不学则殆。一点也没错,学和思是要结合的,这样才能进步。现在回想一下,我学到了什么?自己也无言以对了。先容:

GrandCentralDispatch简称(GCD)是苹果公司开辟的手艺,以优化的使用程序撑持多中心处置器和其他的对称多处置体系的体系。这创建在义务并行实行的线程池形式的基本上的。它初次公布在MacOSX10.6,iOS4及以上也可用。
计划:

GCD的事情道理是:让程序平行列队的特定义务,依据可用的处置资本,布置他们在任何可用的处置器中心上实行义务。
一个义务能够是一个函数(function)大概是一个block。GCD的底层仍然是用线程完成,不外如许可让程序员不必存眷完成的细节。
GCD中的FIFO行列称为dispatchqueue,它能够包管先辈来的义务先失掉实行
dispatchqueue分为上面三种:
Serial

又称为privatedispatchqueues,同时只实行一个义务。Serialqueue一般用于同步会见特定的资本或数据。当你创立多个Serialqueue时,固然它们各自是同步实行的,但Serialqueue与Serialqueue之间是并发实行的。
Concurrent

又称为globaldispatchqueue,能够并发地实行多个义务,可是实行完成的按次是随机的。
Maindispatchqueue

它是全局可用的serialqueue,它是在使用程序主线程上实行义务的。
我们看看dispatchqueue怎样利用
1、经常使用的办法dispatch_async

为了不界面在处置耗时的操纵时卡逝世,好比读取收集数据,IO,数据库读写等,我们会在别的一个线程中处置这些操纵,然后关照主线程更新界面。
用GCD完成这个流程的操纵比后面先容的NSThreadNSOperation的办法都要复杂。代码框架布局以下:

  • dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{
  • //耗时的操纵
  • dispatch_async(dispatch_get_main_queue(),^{
  • //更新界面
  • });
  • });
假如如许还不明晰的话,那我们仍是用上两篇博客中的下载图片为例子,代码以下:

  • dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{
  • NSURL*url=[NSURLURLWithString:@"http://avatar.csdn.net/2/C/D/1_totogo2010.jpg"];
  • NSData*data=[[NSDataalloc]initWithContentsOfURL:url];
  • UIImage*image=[[UIImagealloc]initWithData:data];
  • if(data!=nil){
  • dispatch_async(dispatch_get_main_queue(),^{
  • self.imageView.image=image;
  • });
  • }
  • });
运转显现:

<br>
是否是代码比NSThreadNSOperation简便良多,并且GCD会主动依据义务在多核处置器上分派资本,优化程序。
体系给每个使用程序供应了三个concurrentdispatchqueues。这三个并发调剂行列是全局的,它们只要优先级的分歧。由于是全局的,我们不必要往创立。我们只必要经由过程利用函数dispath_get_global_queue往失掉行列,以下:

  • dispatch_queue_tglobalQ=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
这里也用到了体系默许就有一个串行行列main_queue

  • dispatch_queue_tmainQ=dispatch_get_main_queue();
固然dispatchqueue是援用计数的对象,可是以上两个都是全局的行列,不必retain或release。
2、dispatch_group_async的利用

dispatch_group_async能够完成监听一组义务是不是完成,完成后失掉关照实行其他的操纵。这个办法很有效,好比你实行三个下载义务,当三个义务都下载完成后你才关照界面说完成的了。上面是一段例子代码:

CoreAnimation---制作动画很强大很喜欢的框架可以用少量的代码写出漂亮的动画CQuartz2D---强大的2D绘图库COpenGL---不用介绍了超级强大的3D库CCoreImage---
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-16 21:25

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表