2017-05-29 60 views
0

我在初始屏幕上爲NSManaged對象創建NSFetchRequest。我有時在一個場景中崩潰的時候我:從核心數據中刪除對象並切換視圖控制器時發生崩潰

  • 切換到另一個視圖控制器我的標籤欄控制器內
  • 再拍提取具有相同管理目標類型
  • 刪除一個共同的管理對象也要求出現在我最初的VC的fetchrequest中。 VC包含一個表格視圖。
  • 撥動保存管理方面的第一個VC,並重新加載,我不使用NSFetchResutltsController管理這些返回的對象中的數據

。崩潰發生在我的tableview重新加載時。我做了另一個請求,並期望被刪除的對象不被返回,但它確實。當我的單元格試圖讀取已刪除對象的屬性時,它會讀取uninitialized並崩潰。在兩個VC之間切換時,這大概會發生在5次中的1次。我在我的所有CoreData函數中都使用了performAndWait

有沒有辦法解除兩個屏幕之間的管理對象的關係?如果不是,我如何在第一個VC中獲取我的獲取請求,而不是返回在第二個VC中刪除的對象,保持同步?

+0

什麼是崩潰消息和它崩潰的代碼行? – Paulw11

+0

可以在這裏添加崩潰日誌... –

回答

1

NSManagedObject不像其他對象。它本身不包含任何信息。它有一個指向其上下文和objectID的指針。當您訪問它的屬性時,它會將請求轉發到上下文以獲取它所需的信息。所以當一個實體從上下文中被刪除時,managedObject停止工作並導致崩潰。這就是爲什麼一般情況下,我認爲這是一個不好的做法,以保持一個指向managedObject的指針,並且總是使用fetchedResultsController訪問它們,即使只有一個對象也是如此,並且只有在managedObjects結果被丟棄後才執行提取操作。

有兩種可能的解決方案,你在你的問題中暗示了。您可以將值從managedObject複製出來,也可以使用fetchedResultsController。如果您複製這些值,那麼即使在刪除實體後,它也會顯示爲正常。如果使用fetchedResultsController,則fetchedObjects屬性將永遠不會包含已刪除的對象,並且該對象在刪除後將不可訪問。

我會推薦使用fetchedResultsController。你不需要害怕它。這不是一個很大的開銷,即使只提取一個對象也是合理的。

+0

感謝您的詳細解答Jon。我將在兩個屏幕之間實現fetchResultsController。 – yamski

相關問題