`
hua397
  • 浏览: 53795 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

dispatch小记

 
阅读更多

 

  GCD大名鼎鼎,也经常用,不过大多是copy居多,没认真研究,今天和盆友交流,他碰到个经典场景:进入一个controller,请求网络数据,在数据还没返回之前就退出这个controller,导致crash,因为controller已经release,而异步处理会调用controller,造成BAD_ACCESS.


  我以前用的operationQueue,在dealloc直接全部cancel就OK了,而介个dispatch没提供cancel之类的函数raywenderlich大神倒是写了个帖子用的create/release配对来解决cancel的问题(详见 http://www.raywenderlich.com/4295/multithreading-and-grand-central-dispatch-on-ios-for-beginners-tutorial)


  不过,事情没那么简单.google了一会,找到几个帖子,特别是这个

http://yxiaogang.blog.163.com/blog/static/196021162201110255429370/

create产生的只是串行的dispatch,也就是说前一个block执行完,才执行下一个block,效率感觉不太给力,虽然可以cancel掉,如果异步处理只有那么一两个倒也可以.至于并发的dispath只有系统提供的3个,效率虽然高,但只能通过dispatch_get_global_queue返回,它们是不能release的


  除了release,那个crash也能通过其他方式解决,看了一些帖子,有个靠谱的思路是通过一个标记判断阻止controller的调用,如加个isRelease的BOOL值,它会在controller的dealloc里面变成YES,当dispatch异步数据下载完时,判断一下,如果isRelease为YES,说明controller被释放了,就不进行后续处理


  还有个帖子搞了个比较奇葩的解决方法,即异步调用前[self retain],得到数据后,返回主线程后[self release],嘿嘿(详见 http://www.fieryrobot.com/blog/2010/06/27/a-simple-job-queue-with-grand-central-dispatch/)


还有几个相关的帖子一并列出:

http://www.cnblogs.com/ydhliphonedev/archive/2012/11/18/2776289.html  深入浅出

http://www.cnblogs.com/walaqi/archive/2012/03/15/2398363.html

http://www.tanhao.me/pieces/392.html  信号量

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics