本人有若干成套学习视频, 可试看! 可试看! 可试看, 重要的事情说三遍 包含Java
, 数据结构与算法
, iOS
, 安卓
, python
, flutter
等等, 如有需要, 联系微信tsaievan
.
观察者模式可以说是程序设计中最重要的模式, 在面向对象编程的过程中, 我们很大程度上都扮演了观察者的角色, 当 A 发生某种改变时, B 将执行某种操作, 这是一种很常见的模式, 甚至代表了我们整个世界的运转. 那么我们如何将 A 的改变,告知 B 呢?
- 首先, B 要对 A 的改变有兴趣, 也就是成为 A 的观察者;(订阅通知)
- 其次, A 发生改变了之后, B 将作出什么样的操作; (接收通知后执行的操作)
- 最后, A 的改变需要通过一定的途径告诉B.(发通知)
打个很简单的比方,
- B 买了一只股票叫 A; (订阅通知)
- 当 A 涨或者跌的时候, B 应该要去买或者卖; (接收通知后执行的操作)
- 那么 A 会通过一些平台(大智慧等)告知 B 涨跌的状况 (发通知)
这就是简单的通知机制
在 iOS 中, Foundation 框架为我们封装了一个通知中心的单例, 通过这个单例,我们可以去完成这种操作甚至传值(userInfo)
对于一个A 来说,可以将这个通知传给所有订阅了这个通知的人, 也就是说股票 A 要像所有买了这只股票的人告知其涨跌状况,如下图所示:
发布通知示意图对于 B 来说,作为观察者,我当然也可以观察多个对象的变化, 就像 B 可以买多只股票一样
接收通知示意图假如我现在有个需求, 第二个控制器要回传一个颜色信息给第一个控制器,并赋值给第一个控制器的 view, 怎么做?方法很多,用通知,无非就这么几步:
- 订阅通知
- 收到通知后的进行的操作(其实可以用一个以 block 为参数的方法)
第一个控制器的代码
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[[NSNotificationCenter defaultCenter] addObserverForName:@"changeColor" object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification * _Nonnull note) {
self.view.backgroundColor = note.userInfo[@"color"];
}];
}
- 第二个控制器发布通知
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
[[NSNotificationCenter defaultCenter]postNotificationName:@"changeColor" object:nil userInfo:@{@"color":[UIColor redColor]}];
}
这样, 当完成触屏操作后,第二个控制器会通过通知把颜色信息传给第一个控制器,并给他的 view 赋值
- 第一个控制器移除通知(养成好的习惯, 有添加, 有移除)
- (void)dealloc
{
[[NSNotificationCenter defaultCenter]removeObserver:self];
}
完成效果:
完成效果
网友评论