判斷observer 觀察了哪些keyPath

2021-09-25 19:37:36 字數 1631 閱讀 1779

@inte***ce objtest1 : nsobject

@property (nonatomic, copy) nsstring *name;

@property (nonatomic, copy) nsstring *path;

@end

@implementation objtest1

@end

@inte***ce objtest2 : nsobject

@end

@implementation objtest2

- (void)observevalueforkeypath:(nsstring *)keypath ofobject:(id)object change:(nsdictionary*)change context:(void *)context

@end

//測試,呼叫

objtest1 *obj1 = [objtest1 new];

objtest2 *obj2 = [objtest2 new];

obj1.name = @"aaa";

[obj1 addobserver:obj2 forkeypath:@"name" options:nskeyvalueobservingoptionnew | nskeyvalueobservingoptionold context:nil];

obj1.name = @"bbb";

id info = obj1.observationinfo;

id info1 = [info valueforkey:@"_observances"];

id info2 = [info1 valueforkey:@"_property"];

id info3 = [info2 valueforkey:@"_keypath"];

nslog(@"*****= 0 %@",info);

nslog(@"*****= 1 %@",info1);

nslog(@"*****= 2 %@",info2);

nslog(@"*****= 3 %@",info3);

//列印結果

2019-08-02 14:57:23.577722+0800 observertest[9223:780503] *****= 0 (

context: 0x0, property: 0x6000019537e0>

)2019-08-02 14:57:23.577872+0800 observertest[9223:780503] *****= 1 (

"context: 0x0, property: 0x6000019537e0>"

)2019-08-02 14:57:23.577994+0800 observertest[9223:780503] *****= 2 (

"")2019-08-02 14:57:23.578077+0800 observertest[9223:780503] *****= 3 (

name

)

如上面測試 結論 用上面這些私有字段可以檢測 被觀察者 被觀察的 keypath。

若新增兩次 「name」 的觀察,測試 info3 就有兩個 name。

移除觀察者前,可以用這個判斷是否新增了 這個keypath 的觀察者!

觀察者模式 Observer

個人理解 觀察者模式的核心是subject的attach和detach方法,載入observer物件 uml類圖 實現 public abstract class subject public void detach observer observer public void notify publ...

觀察者模式 ObServer

觀察者模式 observer 定義物件間的一種一對多的依賴關係,當乙個物件的狀態發生改變時,所有依賴於它的物件都得到通知並被自動更新 觀察者模式 observer 觀察者模式定義了一對多依賴關係,讓多個觀察者物件同時監聽某乙個主題物件。讓主題物件在狀態發生變化時,會通知所有觀察者物件,讓他們能夠自動...

觀察者模式(OBSERVER)

觀察者模式是我選擇將其列出來的第乙個模式。看了這個模式的概念之後,有種豁然開朗的感覺。工作也由實踐上公升到了理論。平時使用的各種 net 控制項都使用了這種模式,將這種模式應用到組成乙個系統的各個元件中去,怎乙個 妙 字了得。理解了它之後,不竟又對 net 的框架敬佩有佳。不知道這其中隱藏了多少未知...