MacDev 板


LINE

各位好, 最近在寫一個架構上出了點問題,想要請教一下 問題: 如何在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的方法 其實就是想避免這個 想問一下這該如何達成? 感謝各位前輩的提點 --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.135.62.74
※ 文章網址: http://webptt.com/m.aspx?n=bbs/MacDev/M.1417621332.A.4A8.html
1F:→ darktt: 在B銷毀的時候將Delegate設定成nil即可 12/04 00:09
感謝提醒,我有在B的dealloc設定A的delegate 為 nil
2F:推 kiii210: 咦,delegate的property設成weak不是可以避免這種問題嗎? 12/04 00:22
3F:→ uranusjr: Yeah, weak property 應該會自動在目標消失時 nil-out 12/04 00:31
4F:→ uranusjr: 如果有問題請附上簡單範例 12/04 00:33
剛剛試了一下weak property,還是有同樣的問題QQ 下班之後我再附上完整範例
5F:→ darktt: 主要是A在另外一個thread,它的delegate沒有與main thread 12/04 09:02
6F:→ darktt: 同步所造成的 12/04 09:02
A其實是隸屬於B的一個子元件,並且A會在thread開始與結束時retain/release delegate 然後B會在viewDdidDisappear的時候把A停掉 所以應該是不會有B比A早死的狀況,也不會有同步的問題吧..?我猜
7F:推 howdiun: respondsToSelector有加嗎 12/04 09:10
是的,A的程式碼大概長這樣: // A的Thread method - (void)threadA { [delegate_ retain]; while(![NSThread currentThread].isCancelled) { if (delegate_ && [delegate_ respondsToSelector:@selector(callback)] { NSMethodSignature *signature = [(NSObject *)delegate_ methodSignatureForSelector:@selector(callback)]; NSInvocation *invoke = [NSInvocation invocationWithMethodSignature:signature]; [invoke setTarget:delegate_]; [invoke setSelector:@selector(callback)]; [invoke setArgument:&self atIndext:2]; ... [invoke performSelectorOnMainThread:@selector(invoke) withObject:nil waitUintilDone:NO]; } } [delegate_ release]; } // B的dealloc - (void)dealloc { [A setDelegate:nil]; [A release]; A = nil; ... [super dealloc]; } ※ 編輯: Esvent (220.135.62.74), 12/04/2014 10:33:35
8F:→ uranusjr: Delegate 會 release owner 怎麼看都怪... 12/04 10:38
9F:→ uranusjr: 這應該只是名詞的問題而已就是了, 其實它們兩個不是真的 12/04 10:38
10F:→ uranusjr: delegate 關係, 比較像 target-action 12/04 10:39
11F:→ Esvent: 找到一個方法..在B的dealloc讓mainRunLoop多跑個幾秒就ok 12/10 19:00
12F:→ Esvent: 不過因為沒有檢查到底有沒有跑完..所以還是有很低的機率會 12/10 19:01
13F:→ Esvent: 當掉 12/10 19:01







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Gossiping站內搜尋

TOP