2011-10-27 59 views
5

撕裂我的頭髮在這,任何想法或建議將不勝感激。performSelectorOnMainThread不會執行

我有一個對象從子線程調用performSelectorOnMainThread:withObject:waitUntilDone:本身。這95%的時間工作正常。從iOS beta版開始,現在進入發行版,每隔一段時間,設備將拒絕執行performSelectorOnMainThread:withObject:waitUntilDone:調用...沒有錯誤消息,它不會崩潰,我不能讓設備進入「失敗「但一旦它在那裏,它會繼續失敗,直到我刪除並重新安裝應用程序,或強制它退出,然後調整它的位置服務補貼,然後再次啓動它,然後再次將其位置服務重新調整爲正常。 ..重新啓動設備不能解決它。重新安裝而不先刪除不會修復它。這很奇怪....我知道它大部分時間工作,因爲大多數設備沒有問題,但是有些設備會有規律地失敗(每隔3或4天)。我知道performSelectorOnMainThread:withObject:waitUntilDone:並不是在調用它應該的,因爲我現在有一個失敗的設備,並且我已經將NSLog放入了應該調用的方法。它功能正常,但在失敗的設備上,當使用performSelectorOnMainThread:withObject:waitUntilDone:調用該方法時,NSLog顯示它沒有運行...

這開始發生在iOS 5 beta版本上,並且在發佈時會發生。它經常發生在我的兩臺設備上,但是我沒有親自測試過其他10臺設備。我認爲這只是我的設備在測試版中的一些問題,但它發生在我從未接觸過測試版的全新4S以及用戶的一款iPad 2上(不在我的iPad 2上)。

我真的不知道去哪裏看。我告訴它執行,它通常在幾乎所有設備上執行,但同一行在某些情況下沒有響應並且沒有錯誤等...

+0

是你有任何機會使用CoreData?我有類似的問題。真正發生的是線程死鎖,等待使用CoreData執行讀取操作,而另一個線程正在嘗試寫入。 – picciano

+0

@picciano你是如何解決這個問題的?我遇到同樣的問題,無法弄清楚我需要做什麼來解決僵局。 –

回答

3

performSelectorOnMainThread:withObject:waitUntilDone有時可能無法使用。你有沒有想過試圖使用lib調度?

您可以創建一個塊,並張貼這樣在主線程:

dispatch_async(dispatch_get_main_queue(), ^{ 
    <do work here> 
}); 

這將具有相同的保存受其影響使用performSelectorOnMainThread:withObject:waitUntilDone http://developer.apple.com/library/ios/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html#//apple_ref/doc/uid/TP40008091-CH102-SW1

0

線程的RunLoop有幾種不同的模式。 有可能在時間,你打吧主線程比默認的(這是一個由performSelectorOnMainThread:withObject:WaitUntilDone:針對不同的模式運行。

考慮使用performSelectorOnMainThread:withObject:waitUntilDone:modes:
Apple's documentation

此外 - GCD(libdispatch)是真棒,但它不會保護你自己做飯死鎖: 考慮您的方法是在主線程上運行的情況下和你打電話:

dispatch_sync(dispatch_get_main_queue(), ^{ 
    <do work here> 
});