2009-09-13 31 views
1

以下步驟導致NSFetchedResultsController崩潰。NSFetchedResultsController崩潰

  1. 我嘗試將第一個元素添加到NSFetchedResultsController支持的TableView中。
  2. 我創建了一個臨時的MO對象並顯示了一個Modal View窗格來添加新的對象。
  3. 在添加圖紙(模態視圖控制器)上,按下取消按鈕以放棄新元素。
  4. 在取消按鈕的CancelAction回調中,我刪除了我創建的新臨時對象。
  5. 此處的代碼與Core Data的Apple示例代碼完全相同。我唯一額外的代碼是在添加表單被解除後調用[tableView reloadData]。
  6. 只有當我嘗試添加第一個元素時纔會導致崩潰,因爲它與NSFetchedResultsController中錯誤的節數有關。

這導致在下面給出崩潰。如果我刪除多餘的調用reloadData,崩潰是不可見的。如果我向配方示例代碼數據添加reloadData調用,那麼也會發生崩潰。

它是一個已知的問題與NSFetchedResultsController?

2009-09-13 18:22:45.600食譜[14926:20B] *終止應用程序由於未捕獲的異常 'NSRangeException',原因:「* - [NSCFArray objectAtIndex:]:索引(0)超出界限(0)」

回答

4

正如你自己發現的,你不應該使用[的tableView reloadData],因爲你可能使用NSFetchedResultsController委託方法

– controllerWillChangeContent: 
– controller:didChangeObject:atIndexPath:forChangeType:newIndexPath: 
– controller:didChangeSection:atIndex:forChangeType: 
– controllerDidChangeContent: 

這些方法實際上是負責更新您的表視圖當你添加,刪除或修改對象時。因此,當您將調用添加到[tableView reloadData]時,會發生什麼情況是兩個不同的線程正在訪問/修改您的表視圖。這會導致您遇到的崩潰。

如果您使用的不是委託方法,然後死機是由於別人在你的代碼的東西。

+0

我已經爲NSFetchedResultsController設置了委託,但是我還沒有實現這些功能。如果我刪除委託,問題就會消失。所以這證實了這種行爲。 是否有任何文檔比API文檔更詳細地討論NSFetchedResultsController?我沒有看到那裏提到的這種行爲。請讓我知道,並感謝所有的幫助。 – siasl

+0

不幸的是,據我所知,除了API之外,沒有其他文檔(至少沒有其他文檔與觀察到的行爲有關)。我說的是基於我個人的經驗。 –

相關問題