2010-03-19 23 views
1

在我的Cocoa Mac應用程序中,我有一個實例A,其中包含一組無效的實例B,該實例組又有一組有序的實例C。一個實例C只能在一個實例BB中只能在一個A中。如何有效地從Cocoa模型的更深層次獲取所有實例?

我想要在實例A上提供所有實例的無序集合C。每次我都可以枚舉B的所有實例,但這對我經常需要做的事情來說似乎很昂貴。但是,我有點擔心,保持跟蹤C中的實例A可能會變得很麻煩並且是不一致的原因,例如,如果從B中刪除實例C而不是從A中刪除實例C

解決方案1 ​​ - 使用在A一個NSMutableSet和添加或刪除C情況下,每當我做B相同的操作。

解決方案2 - 使用弱在A引用NSHashTable。當從B刪除C時,它也應該消失A

解決方案3 - 使用鍵在A觀測值跟蹤變化的B,並相應更新A一個NSMutableSet

解決方案4 - 簡單地遍歷所有實例B創建一套每當我需要它。

哪種方式最好?有沒有其他的方法,我錯過了?

NB我不會,也不會爲此應用使用CoreData。

+0

你是否對你的代碼進行了簡介?你知道這是你花很多時間的地方嗎?在嘗試優化之前,您應該先進行分析。 – 2010-03-19 09:40:35

+0

我是否正確所有,C的實例在所有數據中都是唯一的? – Vladimir 2010-03-19 14:52:42

+0

不,這段代碼我還沒有分析過,主要是因爲我仍在設計它,而且還有很多配置文件尚未完成。儘管詢問其他人如何實施這一點似乎是一個普遍的問題。 是的,'C'的所有實例都是唯一的。對不起,如果不明確。從邏輯上講,它應該從'C'只在一個'B'中。 – 2010-03-19 17:30:35

回答

1

如果A有一套B對象,每個B對象有一組C的對象,你可以這樣做:

NSSet * allCObjectsInA = [anAObject valueForKeyPath:@"[email protected]"]; 

這是假設你可以通過方法來訪問AB對象叫做- (NSSet *) bObjects;BC對象-(NSSet *) cObjects;

+0

感謝這個指針。那些集合和陣列運營商確實是我忽略的一個很好的選擇。由於'B'包含'C'數組,我可能會使用另一個運算符而不是'@ distinctUnionOfSets',可能是'@ unionOfArrays'。 – 2010-03-19 17:24:21

+1

更正,我不得不使用'@ distinctUnionOfArrays',因爲'@unionOf ...'操作符只能用於數組而不是集合。無論如何,再次感謝這個整潔的解決方案。 – 2010-03-19 18:44:42

0

如果你不需要優化你的代碼,你不應該打擾緩存:每次需要你的設置時,枚舉B的所有實例。

相關問題