觀察者模式實(shí)現(xiàn)原理
簡(jiǎn)介
觀察者模式:觀察者模式定義了一種一對(duì)多的依賴(lài)關(guān)系塘秦,讓多個(gè)觀察者對(duì)象同時(shí)監(jiān)聽(tīng)某一個(gè)主題對(duì)象。當(dāng)這個(gè)主題對(duì)象在狀態(tài)發(fā)生變化時(shí),會(huì)通知所有觀察者對(duì)象,使得他們能夠更新自己卓练。
實(shí)現(xiàn)
觀察者模式最常見(jiàn)的就是 KVO和 NSNotification
KVO
//這樣點(diǎn)擊 Button 的時(shí)候根據(jù) keyPath 來(lái)更改 value 的值,然后實(shí)現(xiàn) observer 的代理方法购啄。
[self.buttonFor2FA addObserver:self forKeyPath:@"kvoNotification" options:NSKeyValueObservingOptionNew context:nil];```
[self.buttonFor2FA setValue:@"ddd" forKey:@"kvoNotification"];
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context
{
if ([keyPath isEqualToString:@"kvoNotification"]) {
//執(zhí)行操作;
}
}
NSNotification
NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter];
[defaultCenter addObserver:self selector:@selector(defaultNotification:) name:@"testNotification" object:nil];
[defaultCenter postNotificationName:@"testlktej" object:nil];
###原理
* 第一步
* 調(diào)用一個(gè)單例方法襟企,單例方法中要注意的是防止第一次調(diào)用沒(méi)有結(jié)束,第二次調(diào)用就又開(kāi)始了狮含。
* 這里我們一般用 GCD 或者用 @synchronized{}增加一個(gè)線(xiàn)程訪(fǎng)問(wèn)等待顽悼。
* 這里面的話(huà)那, 這里創(chuàng)建單例的時(shí)候會(huì)用一個(gè) NSMutableArray 來(lái)保存一個(gè)數(shù)組。為了防止存在多種單例進(jìn)行保存几迄。
* 第二步
* 創(chuàng)建 add 的過(guò)程就是創(chuàng)建一個(gè)數(shù)據(jù)模型將 observer,selector,name,object的信息保存到數(shù)組里面蔚龙。
*/
* 第三步
* post 通知的時(shí)候就是將數(shù)據(jù)中的數(shù)據(jù)進(jìn)行遍歷然后找到 name 對(duì)應(yīng)的 observer 和 selector 進(jìn)行方法的實(shí)現(xiàn)。