2011-06-19 92 views
7

在普通類中,我有一個NSMutableSet屬性。無論何時添加或刪除對象,我都想執行一些自定義代碼。我知道我可以爲班級編寫幾個類似於addObjectToSet:的方法,但是我想知道是否有更直接的KVO優化解決方案。Key-Value觀察NSMutableSet

事實證明,當您嘗試添加觀察者時,NSSet會引發異常。毫不奇怪,因爲可能沒有命名keyPath來觀察。 The documentation是有關異常的很清楚,但我不理解這個建議的解決方法:

而是觀察組,觀察無序一對多的關係爲其設定爲相關對象的集合。

難道有人會重申這是什麼意思?那麼解決方法會是什麼樣子?

+1

有一些相關的討論可以在下面的鏈接中找到http://stackoverflow.com/questions/1610422/kvo-on-an-nscountedset –

回答

6

這是說的一個非常密集的方式「不觀察者添加到該集合本身,觀察者添加到包含集合類」:

[myObjWithASetAsIvar addObserver:self 
         forKeyPath:@"nameOfIvarHoldingTheSet" 
         options:NSKeyValueObservingOptionNew 
         context:nil]; 

的一個棘手的一點是,你需要將所有訪問包裝到該設置中,以便發送正確的通知。在含有該組類:

[self willChangeValueForKey:@"nameOfIvarHoldingTheSet"]; 
// Do something with the set 
[self didChangeValueForKey:@"nameOfIvarHoldingTheSet"]; 

還有兩個通知方法專門爲集:willChangeValueForKey:withSetMutation:usingObjects:didChangeValueForKey:withSetMutation:usingObjects:;你可能會發現它們比通用的「價值變化」方法更適合你。所有這一切說,我相信你在第一段中提到的解決方案,在Girish的問題中提到outlined by Peter Hosey,可能是最好的方法。

+0

偉大的,我終於明白了:)我已經寫了如我所建議的那樣,我自己可以訪問該列表,並且知道更多關於KVO的信息。感謝Josh&Girish! – epologee

1

從蘋果的NSSet中的文件(和,通過推理和暗示的NSMutableSet):

NSSet中的對象都沒有觀察到的,因此一個的NSSet對象調用此方法時,會引發異常 。而不是觀察集合,觀察集合爲相關對象的集合 的無序對多關係。

我很高興你似乎已經找到了答案,但事實上,你最初的方法是有缺陷的(在你以爲你可以在一個NSSet中使用的addObserver),這需要被提及,而不管。

0

這其實很清楚,當你將它與一個例子:

如果您具有帳戶的NSSet中的一類銀行,不添加上述觀察員Bank.accounts,加上帳戶的觀察者。銀行