仓酷云

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

[学习教程] IOS编程:iOS开辟之GCD利用总结仓酷云

[复制链接]
爱飞 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:26:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
维护一个堆栈-(void)pushViewController:(UIViewController*)viewControlleranimated:(BOOL)animated是像堆栈里压一个UIViewController-(UIViewController*)popViewControllerAnimated:(BOOL)animated是从堆栈里弹出来一个UIViewController就算你的程序不是像联系人那样向右推进也可以用UINavigationControllerGCD是iOS的一种底层多线程机制,明天总结一下GCD的经常使用API和观点,但愿对人人的进修起到匡助感化。
GCD行列的观点
在多线程开辟傍边,程序员只需将想做的事变界说好,并追加到DispatchQueue(派发行列)傍边就行了。
派发行列分为两种,一种是串行行列(SerialDispatchQueue),一种是并行行列(ConcurrentDispatchQueue)。
一个义务就是一个block,好比,将义务增加到行列中的代码是:
  1. 1dispatch_async(queue,block);
复制代码
当给queue增加多个义务时,假如queue是串行行列,则它们按按次一个个实行,同时处置的义务只要一个。
当queue是并行行列时,不管第一个义务是不是停止,城市立即入手下手实行前面的义务,也就是能够同时实行多个义务。
可是并行实行的义务数目取决于XNU内核,是不成控的。好比,假如同时实行10个义务,那末10个义务并非开启10个线程,线程会依据义务实行情形复用,由体系把持。
猎取行列
体系供应了两个行列,一个是MainDispatchQueue,一个是GlobalDispatchQueue。
前者会将义务拔出主线程的RunLoop傍边往实行,以是明显是个串行行列,我们可使用它来更新UI。
后者则是一个全局的并行行列,有高、默许、低和背景4个优先级。
它们的猎取体例以下:
  1. 1dispatch_queue_tqueue=dispatch_get_main_queue();23dispatchqueue_tqueue=dispatch_get_global_queue(DISPATCH_QUEUE_PRORITY_DEFAULT,0)
复制代码
实行异步义务
  1. 1dispatch_queue_tqueue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);2dispatch_async(queue,^{3//...4});
复制代码
这个代码片断间接在子线程里实行了一个义务块。利用GCD体例义务是当即入手下手实行的
它不像操纵行列那样能够手动启动,一样,弱点也是它的不成控性。
令义务只实行一次
  1. 1+(id)shareInstance{2staticdispatch_once_tonceToken;3dispatch_once(&onceToken,^{4_shareInstance=[[selfalloc]init];5});6}
复制代码
这类只实行一次且线程平安的体例常常呈现在单例机关器傍边。
义务组
偶然候,我们但愿多个义务同时(在多个线程里)实行,再他们都完成以后,再实行其他的义务,
因而能够创建一个分组,让多个义务构成一个组,上面的代码在组中多个义务都实行终了以后再实行后续的义务:

<br>
  1. 1dispatch_queue_tqueue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);2dispatch_group_tgroup=dispatch_group_create();34dispatch_group_async(group,queue,^{NSLog(@"1");});5dispatch_group_async(group,queue,^{NSLog(@"2");});6dispatch_group_async(group,queue,^{NSLog(@"3");});7dispatch_group_async(group,queue,^{NSLog(@"4");});8dispatch_group_async(group,queue,^{NSLog(@"5");});910dispatch_group_notify(group,dispatch_get_main_queue(),^{NSLog(@"done");});
复制代码

<br>
提早实行义务
  1. 1dispatch_after(dispatch_time(DISPATCH_TIME_NOW,(int64_t)(10*NSEC_PER_SEC)),dispatch_get_main_queue(),^{2//...3});
复制代码
这段代码将会在10秒后将义务拔出RunLoop傍边。
dispatch_asycn和dispatch_sync
先前已有过一个利用dispatch_async实行异步义务的一个例子,上面来看一段代码:

<br>
  1. 1dispatch_queue_tqueue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);23dispatch_async(queue,^{4NSLog(@"1");5});67NSLog(@"2");
复制代码

<br>
这段代码起首猎取了全局行列,也就是说,dispatch_async傍边的义务被丢到了另外一个线程里往实行,async在这里的寄义是,铛铛前列程给子线程分派了block傍边的义务以后,以后线程会当即实行,其实不会产生堵塞,也就是异步的。那末,输入了局不是12就是21,由于我们没法把控两个线程RunLoop里究竟是怎样实行的。
相似的,另有一个“同步”办法dispatch_sync,代码以下:

<br>
  1. 1dispatch_queue_tqueue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);23dispatch_sync(queue,^{4NSLog(@"1");5});67NSLog(@"2");
复制代码

<br>
这就意味着,当主线程将义务分给子线程后,主线程会守候子线程实行终了,再持续实行本身的内容,那末了局明显就是12了。
必要注重的一点是,这里用的是全局行列,那假如把dispatch_sync的行列换成主线程行列会怎样呢:
  1. 1dispatch_queue_tqueue=dispatch_get_main_queue();2dispatch_sync(queue,^{3NSLog(@"1");4});
复制代码
这段代码会产生逝世锁,由于:
1.主线程经由过程dispatch_sync把block交给客队列后,会守候block里的义务停止再往下走本身的义务,
2.而行列是先辈先出的,block里的义务也在守候客队列傍边排在它之前的义务都实行完了再走本人。
这类轮回守候就构成了逝世锁。以是在主线程傍边利用dispatch_sync将义务加到客队列是不成取的。
创立行列
我们可使用体系供应的函数猎取主串行行列和全局并行行列,固然也能够本人手动创立串行和并行行列,代码为:
  1. 1dispatch_queue_tmySerialDispatchQueue=dispatch_queue_create("com.Steak.GCD",DISPATCH_QUEUE_SERIAL);2dispatch_queue_tmyConcurrentDispatchQueue=dispatch_queue_create("com.Steak.GCD",DISPATCH_QUEUE_CONCURRENT);
复制代码
在MRC下,手动创立的行列是必要开释的
  1. 1dispatch_queue_tqueue=dispatch_get_main_queue();23dispatchqueue_tqueue=dispatch_get_global_queue(DISPATCH_QUEUE_PRORITY_DEFAULT,0)0
复制代码
手动创立的行列和默许优先级全局行列优先级同等,假如必要修正行列的优先级,必要:
  1. 1dispatch_queue_tqueue=dispatch_get_main_queue();23dispatchqueue_tqueue=dispatch_get_global_queue(DISPATCH_QUEUE_PRORITY_DEFAULT,0)1
复制代码
下面的代码修正行列的优先级为背景级别,即与默许的背景优先级的全局行列同等。
串行、并行行列与读写平安性
在向串行行列(SerialDispatchQueue)傍边到场多个block义务后,一次只能同时实行一个block,假如天生了n个串行行列,而且向每一个行列傍边都增加了义务,那末体系就会启动n个线程来同时实行这些义务。
关于串行行列,准确的利用机会,是在必要办理数据/文件合作成绩时利用它。好比,我们能够令多个义务同时会见一块数据,如许会呈现抵触,也能够把每一个操纵都到场到一个串行行列傍边,由于串行行列一次只能实行一个线程的义务,以是不会呈现抵触。
可是思索到串行行列会由于高低文切换而拖慢体系功能,以是我们仍是很希冀接纳并行行列的,来看上面的示例代码:

<br>
  1. 1dispatch_queue_tqueue=dispatch_get_main_queue();23dispatchqueue_tqueue=dispatch_get_global_queue(DISPATCH_QUEUE_PRORITY_DEFAULT,0)2
复制代码

<br>
明显,这5个操纵的实行按次是我们没法预期的,我们但愿在读取1和读取2实行停止后,再实行写进,写进完成后再实行读取3和读取4。
为了完成这个效果,这里可使用GCD的另外一个API:
  1. 1dispatch_queue_tqueue=dispatch_get_main_queue();23dispatchqueue_tqueue=dispatch_get_global_queue(DISPATCH_QUEUE_PRORITY_DEFAULT,0)3
复制代码
如许就包管的写进操纵的并发平安性。
关于没无数据合作的并行操纵,则可使用并行行列(CONCURRENT)来完成。
JOIN举动
CGD使用dispatch_group_wait来完成多个操纵的join举动,代码以下:

<br>
  1. 1dispatch_queue_tqueue=dispatch_get_main_queue();23dispatchqueue_tqueue=dispatch_get_global_queue(DISPATCH_QUEUE_PRORITY_DEFAULT,0)4
复制代码

<br>
这里起了3个异步线程放在一个组里,以后经由过程dispatch_time_t创立了一个超不时间(2秒),程序以后行,当即输入了aaaaa,这是主线程输入的,当碰到dispatch_group_wait时,主线程会被挂起,守候2秒,在守候的历程傍边,子线程分离输入了1和2,2秒工夫到达后,主线程发明组里的义务并没有全体停止,然后输入了bbbbb。

继承自相应的不可变类比如NSMutableArray继承自NSArray他们都添加了可以改变对象内容的方法比如-(void)addObject:(id)anObject添加对象-(void)removeObject:(id)anObject删除对象上面只是一个大概的总结
愤怒的大鸟 该用户已被删除
沙发
发表于 2015-1-21 06:53:12 | 只看该作者
然而,在vmware软件环境下,安装Mac OS X操作系统也是一件非常复杂的事情,而且还有可能花费了大量时间,最后却跑不起来。笔者也是经过了大量的实践,
谁可相欹 该用户已被删除
板凳
发表于 2015-1-24 13:07:29 | 只看该作者
中国如今已然发展成为一个软件大国,软件人才的数量跃居全球之首。当然,在苹果平台的开发领域,也保持了相当强劲的发展势头。然而,很多初入iOS开发门槛的开发者,
飘灵儿 该用户已被删除
地板
发表于 2015-1-26 23:54:51 | 只看该作者
在此,某不才愿将安装成功的Mac OS X系统的vmware虚拟机向有志学习iOS开发的各位学友们免费开放出来,经测试,可以在WindowsXP/Win7系统上完美运行,即便你的机器只有2GB内存。
第二个灵魂 该用户已被删除
5#
发表于 2015-1-29 18:45:08 | 只看该作者
重要的是,放眼全球也的确找不到第二个如苹果iOS平台这样健壮、完整、先进而且为开发者带来真实收益的开发平台来。
因胸联盟 该用户已被删除
6#
发表于 2015-2-2 18:28:10 | 只看该作者
我也从简单的状态栏适配开始,先研究了下关于状态栏的适配,特总结如下,供广大网友一起讨论交流。
精灵巫婆 该用户已被删除
7#
发表于 2015-2-6 03:34:53 | 只看该作者
还有开发工具是用Xcode,是在Mac系统的,你多摸索一下就可以开发简单的应用了,建议你买一本iphone开发秘籍第二版看看,希望可以帮到你,谢谢。
金色的骷髅 该用户已被删除
8#
发表于 2015-2-7 10:31:30 | 只看该作者
看完这个你就可以有多种选择来踏入做应用的阶段
兰色精灵 该用户已被删除
9#
发表于 2015-2-10 10:02:11 | 只看该作者
培训的时候很痛苦,每天要待12个小时,上午讲课,下午和晚自习解决作业,看文档,学习的时候感觉就是资料太少,而且看着资料也不明所以,非常痛苦,
小女巫 该用户已被删除
10#
发表于 2015-2-18 20:50:16 | 只看该作者
在此,某不才愿将安装成功的Mac OS X系统的vmware虚拟机向有志学习iOS开发的各位学友们免费开放出来,经测试,可以在WindowsXP/Win7系统上完美运行,即便你的机器只有2GB内存。
只想知道 该用户已被删除
11#
发表于 2015-3-6 10:18:04 | 只看该作者
我也从简单的状态栏适配开始,先研究了下关于状态栏的适配,特总结如下,供广大网友一起讨论交流。
爱飞 该用户已被删除
12#
 楼主| 发表于 2015-3-6 15:17:23 | 只看该作者
边吃零食边看Stanford的视频教程
乐观 该用户已被删除
13#
发表于 2015-3-11 07:25:05 | 只看该作者
边吃零食边看Stanford的视频教程
简单生活 该用户已被删除
14#
发表于 2015-3-17 23:09:20 | 只看该作者
好处就是运行速度会变快,ios6针对系统的优化进一步加强了,很多网友测试ios6,第一感觉就是速度快,而且ios69会有一些新功能,新浪微博,facetime支持3G网等等。。弊端就是,现在的ios6只能算是正式版本的第一个版本,bug很多,不少人刷完ios6都出现了很多毛病,开不开机,缺少图标等等。。最好现在不要升级,等官网放出下一个版本的时候,再选择升级。。。
蒙在股里 该用户已被删除
15#
发表于 2015-3-25 06:12:57 | 只看该作者
这个办法就是在WindowsXP或Win7的电脑上,使用vmware虚拟机来搭建一个真实的Mac OS X环境。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-22 18:00

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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