IOS编程之被放弃的dispatch_get_current_queue仓酷云
以后一定会坚持多读些相关的书籍,在这里也要感谢一下“清源教育”的老师对我学习中极大的帮助,每次有不懂得问题,都及时得到了他们的回答。想说说被放弃的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=[init];
[*]});
[*];
[*]block();
[*];
[*]}
[*]
[*]dispatch_queue_tqueueA=dispatch_queue_create("com.yiyaaixuexi.queueA",NULL);
[*]dispatch_block_tblock=^{
[*]//dosomething
[*]};
[*]dispatch_sync(queueA,^{
[*]dispatch_reentrant(block);
[*]});
由于封闭文档写的相当好在遇到新框架的时候弄明白框架的功能去文档里搜搜框架的ProgrammingGuide很有用要弄明白框架类的继承结构写iOS的程序不一定都是用OBJC 培训的时候很痛苦,每天要待12个小时,上午讲课,下午和晚自习解决作业,看文档,学习的时候感觉就是资料太少,而且看着资料也不明所以,非常痛苦, 最后在做项目的时候一定要认真对待,毕竟这个直接和你的就业挂钩,这也是锻炼你实际操作的能力。 看完这个你就可以有多种选择来踏入做应用的阶段 在百度搜索你想要了解的类名(苹果的cocoa和cocoatouch框架的类名很有特点很容易搜到,前缀都是NS or UI),看别人写的博客详解 还有开发工具是用Xcode,是在Mac系统的,你多摸索一下就可以开发简单的应用了,建议你买一本iphone开发秘籍第二版看看,希望可以帮到你,谢谢。 特别是在校的学生,都存在一个小小的尴尬——虽然学习iOS开发的热情高涨,但由于没有多余的银子购买昂贵的Mac电脑而踟蹰不前。其实,针对初学者,如果想进入iOS开发的天地 边吃零食边看Stanford的视频教程 培训时可以选择安卓,iOS,Java,因为实习的时候我选了安卓,当时实习时间只有三周,学的晕头转向,而java我也没学过,iOS的基础是C语言,这个大学里还是学过的,于是选择了iOS。 以上可以同时进行,学习过程中尽量不要纠结细节和底层,要知道ios是封闭的、OC是高级语言,我们不可能过多地去了解它的原理,至少在新手阶段没有必要。用迭代的方式更新你的知识,而不是死抠一个知识点。 培训时可以选择安卓,iOS,Java,因为实习的时候我选了安卓,当时实习时间只有三周,学的晕头转向,而java我也没学过,iOS的基础是C语言,这个大学里还是学过的,于是选择了iOS。 要学会通过各种方法将面前的事情变成自己感兴趣的,那专研起来就不会是无聊和折磨了。 我也从简单的状态栏适配开始,先研究了下关于状态栏的适配,特总结如下,供广大网友一起讨论交流。 AD: iPhone文件系统NSFileManager讲解是本文要介绍的内容,主要是通过iphone文件系统来学习NSFileManager的使用方法,具体内容来看本文详解。 其次学习方法和学习心态很重要,在学习当中应该保持一颗良好的心态。应该借鉴别人好的学习方法,大家互相帮助,取长补短。 自从苹果公司开放iOS SDK以来,大量的国内外的软件开发者将关注的目光聚集在苹果的iOS平台上。由于iPhone和iPad自一出现就给人带来了颠覆性的感觉 中国如今已然发展成为一个软件大国,软件人才的数量跃居全球之首。当然,在苹果平台的开发领域,也保持了相当强劲的发展势头。然而,很多初入iOS开发门槛的开发者, 看《iPhone 4与iPad开发基础教程》,跟着一步步来 看《iPhone 4与iPad开发基础教程》,跟着一步步来 其次学习方法和学习心态很重要,在学习当中应该保持一颗良好的心态。应该借鉴别人好的学习方法,大家互相帮助,取长补短。
页:
[1]