2011-09-21 26 views
0

我有一個後臺任務,它獲取大量數據,將其保存到核心數據上下文中,並將該上下文合併到主線程的上下文中。核心數據 - 從另一個線程合併上下文的奇怪例外

我有一個表格列出了這個數據通過NSFetchedResultsController

偶爾(但很少),我得到這方面的代碼的一個奇怪的錯誤:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    /* standard uitableview cell stuff */ 

    PSCourse *course = [_fetchedResultsController objectAtIndexPath:indexPath]; 
    cell.textLabel.text = course.name; // <--- EXCEPTION HERE 

    return cell; 
} 

我得到一個停車就行了上面提到(通過OBJ-C異常斷點)。

如果我按繼續在調試器,我得到這個不知所云的錯誤:

Assertion failed: (_Unwind_SjLj_Resume() can't return), function _Unwind_SjLj_Resume, file /SourceCache/libunwind/libunwind-24.1/src/Unwind-sjlj.c, line 326.

我不知道爲什麼應用程序將上線之上崩潰,但也許有問題的對象是同時去除tableview正在渲染該對象。如果是這樣的話,我該怎麼辦?我應該吞下這個錯誤嗎?我應該以某種方式檢查獲取的結果控制器的狀態嗎?

在此先感謝。

回答

0

您可以刪除異常停止並查看是否可以看到真正的異常嗎?

神祕的錯誤看起來像是在異常系統中失敗。 「放鬆」=展開堆棧,這是將執行傳遞給異常處理程序的一般技術; 「sjlc」= setjump/longjump,堆棧展開的C機制; 「resume」=因爲調試器中途停止了它?

無論如何,如果後臺線程中對象的更改(或刪除)是問題的原因,也許可以通過將持久存儲協調器鎖定在cellForRowAtIndexPath中來解決該問題。它不應該等待整個後臺任務完成。由於你沒有明確鎖定後臺任務(我認爲),Core Data會採取一些或多或少的智能策略來鎖定,可能會在每次操作中獲取和釋放鎖定。所以你的UI只需要等待一個操作(可能是一小批操作)。

它可能仍然會傷害到性能,但嘗試它並沒有什麼壞處。即使它使表現不可接受,但如果它解決了您的問題,您可能會將此作爲確認,至少您猜對了原因。

+0

如果我刪除它,那麼我不會在有問題的線路上休息,但我仍然會得到相同的展開錯誤。 –

+0

而且鎖定行爲聽起來像會殺死性能。 –

相關問題