仓酷云

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

[学习教程] IOS编程之被放弃的dispatch_get_current_queue仓酷云

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

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

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

x
以后一定会坚持多读些相关的书籍,在这里也要感谢一下“清源教育”的老师对我学习中极大的帮助,每次有不懂得问题,都及时得到了他们的回答。想说说被放弃的dispatch_get_current_queue,不能不提一个观点:可重进。
甚么是可重进,来自维基百科:若一个程序或子程序能够“平安的被并行实行(Parallelcomputing)”,则称其为可重进(reentrant或re-entrant)的。
即当该子程序正在运转时,能够再次进进并实行它(并行实行时,一般的实行了局,都切合计划时的预期)。
若一个函数是可重进的,则该函数:


  • 不克不及含有静态(全局)十分量数据
  • 不克不及前往静态(全局)十分量数据的地点
  • 只能处置由挪用者供应的数据
  • 不克不及依附于单实例形式资本的锁
  • 不克不及挪用(call)不成重进的函数(有呼唤(call)到的函数需满意前述前提)
偶然候我们很但愿晓得以后实行的queue是谁,好比UI操纵必要放在mainqueue中实行。假如能够晓得以后事情的queue是谁,就能够很便利的指定一段代码操纵在特定的queue中实行。dispatch_get_current_queue()恰好能帮上忙。因而乎,在指定的queue中做一些操纵,就能够十分明晰的完成:

  • voidfunc(dispatch_queue_tqueue,dispatch_block_tblock)
  • {
  • if(dispatch_get_current_queue()==queue){
  • block();
  • }else{
  • dispatch_sync(queue,block);
  • }
  • }
然后潜认识里,以为这个函数是可重进的。
但当targetqueue刚好是currentqueue时,同步堵塞会招致逝世锁。

  • -(void)deadLockFunc
  • {
  • dispatch_queue_tqueueA=dispatch_queue_create("com.yiyaaixuexi.queueA",NULL);
  • dispatch_queue_tqueueB=dispatch_queue_create("com.yiyaaixuexi.queueB",NULL);
  • dispatch_sync(queueA,^{
  • dispatch_sync(queueB,^{
  • dispatch_block_tblock=^{
  • //dosomething
  • };
  • func(queueA,block);
  • });
  • });
  • }

成绩出在GCD行列自己是不成重进的,串行同队伍列的层级干系,是呈现成绩的基本缘故原由。
为了避免相似的误用,苹果在iOS6放弃了dispatch_get_current_queue()办法。壮大的dispatch_get_current_queue()也只能看成一个调试工具了。


那末应当怎样包管GCD办法可重进呢?


  • dispatch_queue_set_specific标志行列
  • 递回锁
分离给出两种办法的示例代码片断:
1)dispatch_queue_set_specific

  • dispatch_queue_tqueueA=dispatch_queue_create("com.yiyaaixuexi.queueA",NULL);
  • dispatch_queue_tqueueB=dispatch_queue_create("com.yiyaaixuexi.queueB",NULL);
  • dispatch_set_target_queue(queueB,queueA);

  • staticintspecificKey;
  • CFStringRefspecificValue=CFSTR("queueA");
  • dispatch_queue_set_specific(queueA,
  • &specificKey,
  • (void*)specificValue,
  • (dispatch_function_t)CFRelease);

  • dispatch_sync(queueB,^{
  • dispatch_block_tblock=^{
  • //dosomething
  • };
  • CFStringRefretrievedValue=dispatch_get_specific(&specificKey);
  • if(retrievedValue){
  • block();
  • }else{
  • dispatch_sync(queueA,block);
  • }
  • });

2)递回锁

  • voiddispatch_reentrant(void(^block)())
  • {
  • staticNSRecursiveLock*lock=nil;
  • staticdispatch_once_tonceToken;
  • dispatch_once(&onceToken,^{
  • lock=[[NSRecursiveLockalloc]init];
  • });
  • [locklock];
  • block();
  • [lockunlock];
  • }

  • dispatch_queue_tqueueA=dispatch_queue_create("com.yiyaaixuexi.queueA",NULL);
  • dispatch_block_tblock=^{
  • //dosomething
  • };
  • dispatch_sync(queueA,^{
  • dispatch_reentrant(block);
  • });

由于封闭文档写的相当好在遇到新框架的时候弄明白框架的功能去文档里搜搜框架的ProgrammingGuide很有用要弄明白框架类的继承结构写iOS的程序不一定都是用OBJC
愤怒的大鸟 该用户已被删除
沙发
发表于 2015-1-21 11:17:22 | 只看该作者
培训的时候很痛苦,每天要待12个小时,上午讲课,下午和晚自习解决作业,看文档,学习的时候感觉就是资料太少,而且看着资料也不明所以,非常痛苦,
谁可相欹 该用户已被删除
板凳
发表于 2015-1-24 20:35:53 | 只看该作者
最后在做项目的时候一定要认真对待,毕竟这个直接和你的就业挂钩,这也是锻炼你实际操作的能力。
简单生活 该用户已被删除
地板
发表于 2015-1-26 12:42:28 | 只看该作者
看完这个你就可以有多种选择来踏入做应用的阶段
5#
发表于 2015-1-29 06:58:38 | 只看该作者
在百度搜索你想要了解的类名(苹果的cocoa和cocoatouch框架的类名很有特点很容易搜到,前缀都是NS or UI),看别人写的博客详解
再见西城 该用户已被删除
6#
发表于 2015-1-31 06:04:25 | 只看该作者
还有开发工具是用Xcode,是在Mac系统的,你多摸索一下就可以开发简单的应用了,建议你买一本iphone开发秘籍第二版看看,希望可以帮到你,谢谢。
不帅 该用户已被删除
7#
发表于 2015-2-2 22:03:56 | 只看该作者
特别是在校的学生,都存在一个小小的尴尬——虽然学习iOS开发的热情高涨,但由于没有多余的银子购买昂贵的Mac电脑而踟蹰不前。其实,针对初学者,如果想进入iOS开发的天地
第二个灵魂 该用户已被删除
8#
发表于 2015-2-5 18:30:39 | 只看该作者
边吃零食边看Stanford的视频教程
金色的骷髅 该用户已被删除
9#
发表于 2015-2-8 13:44:53 | 只看该作者
培训时可以选择安卓,iOS,Java,因为实习的时候我选了安卓,当时实习时间只有三周,学的晕头转向,而java我也没学过,iOS的基础是C语言,这个大学里还是学过的,于是选择了iOS。
爱飞 该用户已被删除
10#
发表于 2015-2-25 15:28:54 | 只看该作者
以上可以同时进行,学习过程中尽量不要纠结细节和底层,要知道ios是封闭的、OC是高级语言,我们不可能过多地去了解它的原理,至少在新手阶段没有必要。用迭代的方式更新你的知识,而不是死抠一个知识点。
冷月葬花魂 该用户已被删除
11#
发表于 2015-3-7 22:55:57 | 只看该作者
培训时可以选择安卓,iOS,Java,因为实习的时候我选了安卓,当时实习时间只有三周,学的晕头转向,而java我也没学过,iOS的基础是C语言,这个大学里还是学过的,于是选择了iOS。
小魔女 该用户已被删除
12#
发表于 2015-3-12 22:24:44 | 只看该作者
要学会通过各种方法将面前的事情变成自己感兴趣的,那专研起来就不会是无聊和折磨了。
若天明 该用户已被删除
13#
发表于 2015-3-19 14:15:53 | 只看该作者
我也从简单的状态栏适配开始,先研究了下关于状态栏的适配,特总结如下,供广大网友一起讨论交流。
只想知道 该用户已被删除
14#
发表于 2015-3-27 23:10:36 | 只看该作者
AD: iPhone文件系统NSFileManager讲解是本文要介绍的内容,主要是通过iphone文件系统来学习NSFileManager的使用方法,具体内容来看本文详解。
活着的死人 该用户已被删除
15#
发表于 2015-4-3 03:02:08 | 只看该作者
其次学习方法和学习心态很重要,在学习当中应该保持一颗良好的心态。应该借鉴别人好的学习方法,大家互相帮助,取长补短。
若相依 该用户已被删除
16#
发表于 2015-4-8 14:58:39 | 只看该作者
自从苹果公司开放iOS SDK以来,大量的国内外的软件开发者将关注的目光聚集在苹果的iOS平台上。由于iPhone和iPad自一出现就给人带来了颠覆性的感觉
兰色精灵 该用户已被删除
17#
发表于 2015-4-10 09:18:20 | 只看该作者
中国如今已然发展成为一个软件大国,软件人才的数量跃居全球之首。当然,在苹果平台的开发领域,也保持了相当强劲的发展势头。然而,很多初入iOS开发门槛的开发者,
精灵巫婆 该用户已被删除
18#
发表于 2015-4-13 16:48:06 | 只看该作者
看《iPhone 4与iPad开发基础教程》,跟着一步步来
蒙在股里 该用户已被删除
19#
发表于 2015-4-13 20:00:56 | 只看该作者
看《iPhone 4与iPad开发基础教程》,跟着一步步来
小女巫 该用户已被删除
20#
 楼主| 发表于 2015-5-6 00:10:19 | 只看该作者
其次学习方法和学习心态很重要,在学习当中应该保持一颗良好的心态。应该借鉴别人好的学习方法,大家互相帮助,取长补短。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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