2013-07-05 29 views
3

在我的iPhone應用程序中,偶爾會看到由tableView:cellForRowAtIndexPath引起的崩潰:在後臺線程上調用。爲什麼tableView:cellForRowAtIndexPath:在後臺線程上調用?

顯然,這不應該發生。我沒有要求它,我的目標是一個委託一個UITableView和基礎呼喚它 - 我在堆棧中有問題的線程唯一看到的是

 
-_WebTryThreadLock(bool) 
-_dequeuReusableViewOfType 
-tableView:cellForRowAtIndexPath: 
-_createPreparedCellForGlobalRow:withIndexPath 
-_pthread_qathread 

在WebTryThreadLock發生崩潰 - 無真的令人驚訝,它不是線程安全的,不應該從主線程中調用。

但我怎麼弄清楚爲什麼我的tableView委託在背景線程上被調用?

我想知道 - 如果我在後臺線程上調用[tableView reloadData],會這麼做嗎?

我一直認爲它只是在主線程上調用調用而不管。我不確定我是否在做這件事,但我可能會這樣做,而且我會檢查一下,但是真的,不應該UIKit檢查並在主線程上調用委託方法?

+0

你可以發佈詳細的崩潰日誌。另外,你是否包含任何第三方框架(任何)? –

+1

你問,「不應該UIKit檢查?」我可以理解你爲什麼要這麼做,但簡單的事實是它不會,你只需確保你的tableview相關調用在主隊列中執行。 – Rob

+0

發佈您的代碼和崩潰日誌以獲得更好的答案 – Jatin

回答

3

您不能在輔助線程上調用[tableView reloadData]。你不能在輔助線程上調用任何UIKit的東西(除了一些例外,如UIImage)。這包括所有tableView方法,包括直接獲取者和設置者。它與渲染是否相關無關緊要。

+0

這也是我的理解,謝謝您的確認。仔細檢查我的代碼後,我確信我不會那樣做。但我會三重檢查以確定三重。那麼,你能想到任何可能導致調用cellForRowAtIndexPath的基礎的(其他)場景:在bg線程上? – Jordan

+2

@Jordan對於表視圖有四種不同的'reload ...'方法,所以請確保你不要從後臺線程中調用它們中的任何一個。還有'scrollTo ...'方法。也不要調用任何會改變你的表視圖的框架,或者,例如,彈出一個你推到它上面的視圖控制器等等。這些都是UIKit的東西,所以如果你確保你做了所有的UIKit調用主隊列,你會沒事的。 – Rob

+1

「所以如果你確保你從主隊列中完成所有的UIKit調用,你將會很好」 - 是的,那也是我的想法。看起來我似乎有一些代碼正在做這件事,但我還沒有發現它! – Jordan

2

這可能是有趣的,撒些這些在你的視圖控制器:(![NSThread isMainThread])

如果{ 的NSLog(@ 「咦?」); }

我很確定UIKit/IOS不會決定在後臺線程上調用表視圖委託方法。你有沒有dispatch_async,detachNewThreadSelector,performSelectorInBackground?

+0

>很確定UIKit/IOS不會決定在後臺線程上調用一個> table view委託方法 - 是的,這也是我的信念,到目前爲止,我沒有理由相信。 – Jordan

+0

我正在檢查isMainThread,我可以在任何地方進行堆棧轉儲,並且在我發現我處於錯誤線程的地方進行堆棧轉儲,希望瞭解我是如何到達那裏的。 – Jordan

+0

+1 ....呃? –

相關問題