观察者模式实现原理
简介
观察者模式:观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当这个主题对象在状态发生变化时,会通知所有观察者对象,使得他们能够更新自己。
实现
观察者模式最常见的就是 KVO和 NSNotification
KVO
//这样点击 Button 的时候根据 keyPath 来更改 value 的值,然后实现 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"]) {
//执行操作;
}
}
NSNotification
NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter];
[defaultCenter addObserver:self selector:@selector(defaultNotification:) name:@"testNotification" object:nil];
[defaultCenter postNotificationName:@"testlktej" object:nil];
###原理
* 第一步
* 调用一个单例方法,单例方法中要注意的是防止第一次调用没有结束,第二次调用就又开始了。
* 这里我们一般用 GCD 或者用 @synchronized{}增加一个线程访问等待。
* 这里面的话那, 这里创建单例的时候会用一个 NSMutableArray 来保存一个数组。为了防止存在多种单例进行保存。
* 第二步
* 创建 add 的过程就是创建一个数据模型将 observer,selector,name,object的信息保存到数组里面。
*/
* 第三步
* post 通知的时候就是将数据中的数据进行遍历然后找到 name 对应的 observer 和 selector 进行方法的实现。