[問題] 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