假設我們在覈心數據模型中有兩個實體:部門和員工。
該部門與員工有一對多的關係。核心數據 - 父上下文的中斷保留週期
我有以下ManagedObjectContexts:
- 根:連接到持久性存儲協調員
- 主營:與父母根上下文
當我想創建一個員工我做到以下幾點:
- 我有部門在主要方面
- 我創造的主要方面
一個Employee - 我分配部門到員工的部門屬性
- 我省主要方面
- 我保存根環境
這會在Main上下文和Root上下文中創建一個保留週期。
如果我沒有兒童上下文(全部在Root上下文中),那麼我可以通過在Employee上調用refreshObject:mergeChanges
來打破保留週期。在我處理兩種情況的情況下,我仍然可以使用該方法來打破主環境中的循環,但是我將如何打破Root環境的循環?
注意:這是一個簡單的例子來描述我的問題。在儀器中,我可以清楚地看到分配數量的增長。在我的應用程序中,我的上下文比一個層次更深,導致了更大的問題,因爲我得到了一個新的實體分配,並保留了每個上下文的保留週期。
更新15/04:NSPrivateQueueConcurrencyType VS NSMainQueueConcurrencyType
既節省了環境後,我可以在同處對象的主要方面進行refreshObject:mergeChanges
。正如預期的那樣,這將重新違反Department對象,打破保留週期並在該上下文中釋放Department和Employee實體。
下一步是打破Root上下文中存在的保留週期(保存Main上下文已將實體傳播到Root上下文)。我可以在這裏執行相同的技巧,並使用Department對象的Root上下文中的refreshObject:mergeChanges
。
奇怪的是:當我的Root上下文是用NSMainQueueConcurrencyType創建的(所有的分配都是重新發生故障和處置),但是在我的Root上下文創建時使用NSPrivateQueueConcurrencyType(所有分配都重新發生故障,但不是 dealloced)。
邊注:爲根上下文中的所有操作都在一個performBlock(與等待)進行調用
更新15/04:第2部分
當我做另外一個(沒用,因爲沒有更改)使用NSPrivateQueueConcurrencyType保存或回滾Root上下文時,對象似乎被解除分配。我不明白爲什麼這不像NSMainQueueConcurrencyType一樣。
更新16/04:演示項目
我已經創建了一個演示項目:http://codegazer.com/code/CoreDataTest.zip
更新21/04:四處
謝謝喬迪Hagings您的幫助!
我正在嘗試將refreshObject:mergeChanges
移出我的ManagedObject didSave
方法。
你能向我解釋的區別:
[rootContext performBlock:^{
[rootContext save:nil];
for (NSManagedObject *mo in rootContext.registeredObjects)
[rootContext refreshObject:mo mergeChanges:NO];
}];
和
[rootContext performBlock:^{
[rootContext save:nil];
[rootContext performBlock:^{
for (NSManagedObject *mo in rootContext.registeredObjects)
[rootContext refreshObject:mo mergeChanges:NO];
}];
}];
頂部一個不釋放對象,下一個呢。
有趣的問題。當您將其分配給員工的部門屬性時,部門實體在哪個上下文中? –
該部門在主要背景下 – Zyphrax
你有一個小的代碼測試用例來證明這一點嗎?你如何保存根上下文?另外,當你轉儲registeredObjects時你看到了什麼?請記住,'performBlock'包裝了一個完整的「用戶事件」,但'performBlockAndWait'不包含。 –