我有一些值是通過集合進行計算的,並且在任何給定的時間可能會或可能不會顯示(因此可能會或可能沒有觀察者)。如果沒有人觀察我的計算值,我寧願不必追蹤集合中的所有成員。有沒有方法可以告訴KVO何時開始/結束特定值?
我可以告訴任何人目前正在觀察一個值,並且我可以告訴他們何時開始觀察嗎?
我知道給定對象foo
我可以使用[foo observationInfo]
來獲得與在foo處,但根指定的關鍵路徑不能自動獲得所有的路徑爲foo觀察員名單(其實它只是變得註冊觀察foo的自我鑰匙的人)。
我有一些值是通過集合進行計算的,並且在任何給定的時間可能會或可能不會顯示(因此可能會或可能沒有觀察者)。如果沒有人觀察我的計算值,我寧願不必追蹤集合中的所有成員。有沒有方法可以告訴KVO何時開始/結束特定值?
我可以告訴任何人目前正在觀察一個值,並且我可以告訴他們何時開始觀察嗎?
我知道給定對象foo
我可以使用[foo observationInfo]
來獲得與在foo處,但根指定的關鍵路徑不能自動獲得所有的路徑爲foo觀察員名單(其實它只是變得註冊觀察foo的自我鑰匙的人)。
從設計的角度來看,這不是一個好主意。如果你真的堅持,當沒有人需要它們不更新內容(這可能是一個合法的情況下,例如,如果更新是昂貴的),你可以介紹的方法來啓動/停止更新:
- (void) beginUpdatingContents;
- (void) endUpdatingContents;
這些應該被綁在課堂內的一個櫃檯上,如果計數器大於0,你就知道有人想要更新內容。這個解決方案是明確的,因此比使用KVO的無聲魔術更好。
如果你想要更多的魔法,那麼如何覆蓋addObserver:forKeyPath:options:context:
和removeObserver:forKeyPath:
並跟蹤仍在觀察的內容?
我過去真正做過這件事的方式是通過設置包裝對象(我稱之爲綁定)來設置KVO並向目標註冊自己。因此,用戶會撥打MyBinding *binding = [targetObject bindKeyPath:@"foo" ...]
,然後再撥打[binding detach]
。然後,您可以使用KVO綁定並保留自己的列表,以便知道它何時爲空。
等一下,如果問題是由沉默的KVO魔術引入的,那麼答案不是**更加沉默的KVO魔術**? – Stripes
有一點,只有太多沉默的KVO魔術。隨着你的解決方案,我覺得我們可能會接近:) – zoul
那麼我的第一條評論是85%的笑話。另外15%是這個項目實際上只是爲了我的iOS和Core Data學習體驗,所以如果我編寫「更多魔術」版本並且認爲它「太」魔術,我實際上更接近於實現我的目標,那麼如果我只是玩它安全。 – Stripes