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 信号量
分享到:
相关推荐
DISPATCH
Dispatch IDS for IExplorer Dispatch Events
以上两种方式都是模拟任务block内为异步操作的情况,方式一先执行的dispatch_group_notify里的代码,后执行的dispatch_group_async里的任务代码,这与我们的初衷相违背。如果任务block内为同步操作时,则无论哪种...
1、通过dispatch_barrier_(a)sync添加的block会等待前边所有的block执行完(不包括回调)才执行。 2、在其后添加的block会在dispatch_barrier_(a)sync添加的block执行完之后(不包括回调)再执行; 不同点: 1、...
connectify dispatch 4.0完美破解版
关于grasshopper的基础练习,dispatch案例的电池资源。
Connectify Dispatch Incl. Hotspot Pro. Multiple Connections, Maximum Speed For the first time, you can connect to the coffee shop Wi-Fi and your 4G mobile device simultaneously, using both Internet...
安装后将Cra目录中的dispatch.dll到软件安装目录中的C:\Program Files\Connectify\plugins\dispatch文件夹内并覆盖同名的那个文件。将Cra目录中的connectify.exe文件复制覆盖到安装程序目录下(默认安装目录在C:\...
双击“Installer”安装Connectify Dispatch...复制Crack目录中的dispatch.dll和web文件夹到软件安装目录中的\plugins\dispatch目录覆盖同名文件。 复制Crack目录中的connectify.exe文件到安装程序目录覆盖同名文件。
Connectify V4.2 with dispatch破解版,内附英文版说明,安装前必看。
spark-dispatch.zip
Connectify Dispatch Hotspot Pro v4.0 破解版(Crack) Connectify 的又一款好软件,他能够让你所链接的网络叠加复用,达到最高速的上网速度。比如你的电脑连接一条网线,并且一个手机连接着CMCC 并且开启热点连到你...
两种方式都是模拟任务block内为异步操作的情况,方式一先执行的dispatch_group_notify里的代码,后执行的dispatch_group_async里的任务代码,这与我们的初衷相违背。如果任务block内为同步操作时,则无论哪种方式都...
dispatch_apply,dispatch_group,dispatch_barrier,dispatch_source的示例.
ios demo,dispatch_async,DISPATCH_QUEUE_CONCURRENT,多任务并发执行,自动创建多线
关于dispatch_source 浅析
solidworks PDM Dispatch guide与实例,实例是配置文件,可直接加载
economic dispatch (lossless)
Economic Dispatch Problem with GA
前端项目-d3-dispatch,注册命名回调并用参数调用它们。