[问题] Delegate Callback与Main Thread的问题

楼主: Esvent (Esvent)   2014-12-03 23:42:08
各位好,
最近在写一个架构上出了点问题,想要请教一下
问题:
如何在background thread触法一个应在main thread上执行的delegate callback,
且在delegate dealloc的时候,可清掉已注册在main runloop上却还没被执行的callback
问题完整版:
问题是这样的,我写了一个会自行跟服务器抓图的Class A,
实体化后的Object A会运行在他自己开的Thread上,
并且会提供一个delegate callback,把抓到的图丢回给delegate
然后我又写了一个UIView B,并把他注册为Object A的delegate
但是这样一来,如果在B实作的callback里直接把图画到画面上,
就一定得自己在main thread上呼叫一次display画面才会更新(因为在A的thread)
所以我想说,若是Class A在触法delegate的callback的时候,
直接在main thread上触法就好,
于是我就在Class A用了performSelectorOnMainThread方法来触法callback,
但是这样却又会出现一个问题,就是如果某一天我把UIView B杀掉后,
main runloop上却还有来不及被执行的callback的话,就会造成EXC_BAD_ACCESS...
目前我想到的解决的办法
1. 设定performOnMainThread 的 waitUntilDone 为 YES
但是这会block住抓图的thread, 这样另外开thread的意义就不是很大
2. 在UIView B dealloc的时候清掉main runloop上以B为对象的callback
或是Object A dealloc的时候,清掉自己发出且还未执行的callback
google了一个早上,好像没有办法清掉..(要在同个thread才行)
3. 在B实作的callback里面自己呼叫更新UI的方法
其实就是想避免这个
想问一下这该如何达成? 感谢各位前辈的提点
作者: darktt (小朱)   2014-12-04 00:09:00
在B销毁的时候将Delegate设定成nil即可
作者: kiii210 (HelloWorld!)   2014-12-04 00:22:00
咦,delegate的property设成weak不是可以避免这种问题吗?
作者: uranusjr (←這人是超級笨蛋)   2014-12-04 00:31:00
Yeah, weak property 应该会自动在目标消失时 nil-out如果有问题请附上简单范例
作者: darktt (小朱)   2014-12-04 09:02:00
主要是A在另外一个thread,它的delegate没有与main thread同步所造成的
作者: howdiun (Howdiun)   2014-12-04 09:10:00
respondsToSelector有加吗
作者: uranusjr (←這人是超級笨蛋)   2014-12-04 10:38:00
Delegate 会 release owner 怎么看都怪...这应该只是名词的问题而已就是了, 其实它们两个不是真的delegate 关系, 比较像 target-action
楼主: Esvent (Esvent)   2014-12-10 19:00:00
找到一个方法..在B的dealloc让mainRunLoop多跑个几秒就ok不过因为没有检查到底有没有跑完..所以还是有很低的机率会当掉

Links booklink

Contact Us: admin [ a t ] ucptt.com