2016-05-18 45 views
2

將視圖控制器中的託管對象的引用保留在其生命週期中是不好的做法嗎?保持對Core Data對象的引用不好嗎?

我對Core Data比較新,我最近發現你不能混合來自不同上下文的管理對象,例如如果他們不屬於你的上下文,你不能將對象添加到關係中。

例如,假設我們有一個典型的Employee實體和一個EmployeeDetailsViewController,它保留了對Employee對象的強烈參考。

我應該存儲員工的ID而不是Employee對象嗎?似乎使用ID而不是域對象是相當不方便的,所以我想知道它通常是如何完成的。

+0

這是一個複雜的主題,有很多解決方案。我認爲安全的答案是保留'objectID's,而不是對象。 – Avi

+1

我不會考慮這種不好的做法,實際上它很常見(考慮到核心數據對象在低內存情況下以及不再使用時會變成錯誤)。但是您採用的解決方案應該取決於項目的要求。 –

+1

這可能會讓你感興趣[管理對象生命週期](https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/CoreData/MO_Lifecycle.html#//apple_ref/doc/uid/TP40001075-CH31- SW1) – Sudo

回答

3

歡迎來到核心數據的世界!

首先,您的應用程序中可能有太多NSManagedObjectContext實例。您的整個用戶界面應運行關閉ONE上下文。這將解決你的關係問題。

至於舉辦參考,沒有問題舉行他們除了當有機會刪除該對象從另一個線程。如果您遇到了在後臺線程上刪除的情況(例如從網絡操作中刪除),那麼您可能不想保留對這些對象的強引用,因爲它可能會使您陷入困境。

對於一種變化有一個單獨的上下文是一個好主意,例如,來自服務器的東西,另一個用於例如用戶更改(通過UI進行)?我正在開發一款具有「同步離線更改」功能的應用程序,並試圖弄清楚如何分別跟蹤這兩種更改類型,以便例如,如果用戶修改了同一個對象,則來自服務器的更改將被丟棄。 (你也可以看看我的有關同步的其他問題)(多麼漫長的評論!)

所以,我住的規則:

  • 如果UI;主隊列上下文。沒有例外
  • 如果不是UI;專用隊列上下文。沒有例外

我通常有我的私人隊列上下文作爲主要隊列上下文的子節點,以減少代碼量和我需要處理的合併。

因此,您的服務器同步不是UI,應該針對私有子上下文運行。

觀看關於MVC-N的更多討論。

+0

爲某種變化提供單獨的上下文是一個好主意,例如來自服務器的東西,另一個用於例如用戶更改(通過UI進行)?我正在開發一款具有「同步離線更改」功能的應用程序,並試圖弄清楚如何分別跟蹤這兩種更改類型,以便例如,如果用戶修改了同一個對象,則來自服務器的更改將被丟棄。 (你也可以看看我關於同步的其他問題)(多長時間的評論!) – iosdude

+0

簡單的回答你的冗長的問題更新在答案:) –

1

因爲你不會忘記你已經存儲了你的對象,所以沒關係。
我在大部分應用程序中都喜歡這樣。我有一個在啓動時選擇的主用戶,然後保存在rootController中,以避免對CoreData的過多調用,因爲在使用該程序期間它不會改變。

如果實體在應用程序內部發生更改,則需要從CoreData更新保存的對象。

+0

最後一個陳述是無關緊要的。如果必須重新對對象進行重新分析,它自然會效率較低,但一旦加載,您使用的是標準屬性,並且您無法直接訪問核心數據屬性。 – Avi

相關問題