2010-09-13 77 views
5

我在Core Data圖中有一對多的關係,我試圖理解使用CoreDataGeneratedAccessors方法和簡單賦值來改變關係的區別。例如,Core Data Programming Guide有一個部門和員工示例。在那個例子中,他們使用CoreDataGeneratedAccessors聘用和解僱員工:核心數據CoreDataGeneratedAccessors與簡單賦值

[aDepartment addEmployeesObject:newEmployee]; 
[aDepartment removeEmployeesObject:firedEmployee]; 

他們沒有定義的反比關係,但說「部門」是反比關係,以「僱員」。下面的話是否應該完成同樣的事情?

newEmployee.department = aDepartment 
firedEmployee.department = nil; 

根據核心數據編程指南的Manipulating Relationships and Object Graph Integrity章節,後面的例子應該自動修復的所有關係,以保持一致性圖。如果是這種情況,當存在反向關係時,是否有任何理由使用CoreDataGeneratedAccessors?使用CoreDataGeneratedAccessors是否在反向關係上保持圖形一致性?

回答

2

他們沒有定義逆 關係,但說「部門」是 到 「僱員」的反比關係。下面的 應該完成同樣的事情嗎?

無論您修改關係的哪一端(與反向),兩個操作都有相同的結果。

如果是這樣的話,是否有任何理由在存在逆關係時使用CoreDataGeneratedAccessors?使用CoreDataGeneratedAccessors是否在反向關係上保持圖形一致性?

兩種方法的一致性不是問題。 由於性能方面的原因,使用適當的方法修改大型關係非常重要。

溶液1(燒成一個部門的所有僱員)

for (Employee* employee in aDepartment.employees) 
{ 
    employee.department = nil 
} 

溶液2

aDepartment.employees = nil; 

第一溶液將會觸發(表 - )的更新視圖,而第二每次操作後只會導致所有視圖的更新。 如果您處理大量對象,這可能是一個很大的區別。

如果您需要更深入的信息,我認爲類似的話題已經在SO上進行了討論。

+0

Martin-感謝您的回覆。我有一種情況,我可以使用[aDepartment addEmployeesObject:newEmployee]一次,但是應用程序內的後續調用(不管它是否在另一個新的員工上)不會更新。但是,用newEmployee.department = aDepartment替換它始終有效。這兩個電話的行爲似乎不一致,所以我感到困惑,他們應該做同樣的事情。想法? – chris 2010-09-13 17:10:42

+0

@chris - 這聽起來好像你在Department實體和Employee實體之間沒有反向關係。 – TechZen 2010-09-14 12:28:06

+0

在某些特殊情況下,當某些核心數據更改處理和觀察代碼修改關係被觸發時,我只會遇到這種行爲。(這是我的代碼的錯誤) – 2010-09-15 05:32:11