2009-10-05 74 views
2

這是一個Objective-J/Cappuccino的問題,但我添加了可可標記,因爲框架非常相似。管理沒有CoreData的逆關係

卡布奇諾的缺點之一是CoreData尚未被移植過,因此您必須手動創建所有模型對象。

在CoreData中,您的反比關係會自動爲您進行管理......如果將對象添加到另一個對象中的多對多關係中,則可以在兩個方向上遍歷該圖。

沒有CoreData,是否有任何干淨的方法來自動設置這些反相關係?

有關更具體的示例,我們以典型的Department和Employees示例爲例。要使用rails術語,Department對象具有許多Employees和Employee屬於Department。

所以我們的Department模型有一個NSMutableSet(或CPMutableSet)「employees」,它包含一組Employees,而我們的Employee模型有一個變量「department」指向擁有它的Department模型。

是否有一種簡單的方法可以使我在將新的Employee模型添加到集合中時自動設置反向關係(employee.department)?或者相反:如果我設置員工的部門模型,那麼它會自動添加到該部門的員工組中?

我知道我正在創建一個對象,「ValidatedModel」表示我的所有模型的子類,它使用KVO添加了一些設置反向關係的方法。但是我擔心我做了很多毫無意義的工作,並且已經有一種更簡單的方法來做到這一點。

有人可以把我的顧慮休息嗎?

回答

2

我不能專門講Objective-J,但沒有核心數據的通常做法是在setter中設置反比關係。因此,使用員工/部門的例子,你會做這樣的事情:

- (void)setDepartment:(Department *)aDepartment { 
    if (department == aDepartment) 
     return; 

    [department release]; 
    department = [aDepartment retain]; 

    [department addEmployee:self]; 
} 

你需要確保如果新值已符合現有的價值,你不更新你的實例變量。如果您沒有,setDepartment:會調用addEmployee:,並且addEmployee:會以無限循環調用setDepartment:

此外,請注意,這是一個公開的保留週期邀請。這取決於你的模型是如何構建的,但「擁有」另一個模型的對象應該是它的模型。所以我的例子可能不是最好的,因爲說部門「擁有」員工可能更準確。

+0

謝謝,這基本上是我在做什麼。 (除了使用KVO觸發任何一方改變時,並添加另一方。) 因此,它看起來像我在正確的軌道上,謝謝。 – 2009-10-05 19:17:20

+0

如果這就是你正在做的事,你就走在正確的軌道上。我認爲我的方法可能會稍微簡單一點,因爲要做KVO的開銷,但任何一種方式都應該正常工作。 – Alex 2009-10-05 19:35:09

+0

我使用KVO的主要原因是我沒有修改生成的訪問器。 相反,在我的init方法中,我調用一個方法來描述關係的類型,使用哪個屬性以及屬性的逆關係。這會自動設置觀察者等。 我將在我完成所有工作後共享代碼。 – 2009-10-05 19:38:27

2

你可能想要在你的setter中設置關係。使用你的例子,Objective-J代碼看起來與此類似。

- (void)setDepartment:(Department)aDepartment { 
    if (department === aDepartment) 
     return; 

    [department addEmployee:self]; 
} 

正如你所看到的,沒有必要保留/釋放。 Objective-J是基於垃圾收集的JavaScript構建的。所有的內存管理方法實現,但(塞滿你的代碼分開)

也因爲這是JavaScript的它通常建議檢查類型相等(===)有關詳細信息類型相等無可奈何看到:http://www.webreference.com/js/column26/stricteq.html

+0

是的,不必擔心保留/釋放是很好的。 我會記住類型的平等,謝謝! – 2009-10-05 19:58:03

2

查看280 North員工的卡布奇諾擴展卡:http://github.com/nciagra/Cappuccino-Extensions

它包含一個ActiveRecord端口。我還沒有真正關注過這些,但它可能會幫助你。

  • 約翰內斯
+0

看起來非常酷,我將不得不探索更多。除非我弄錯了,否則我認爲它會考慮服務器端的大部分驗證等。這當然很重要,但我認爲做客戶端驗證也很重要,以便爲用戶提供快速體驗。 – 2009-10-06 15:07:27