观察者模式(一)---通知机制

2016-10-13  本文已影响0人  小冰山口

本人有若干成套学习视频, 可试看! 可试看! 可试看, 重要的事情说三遍 包含Java, 数据结构与算法, iOS, 安卓, python, flutter等等, 如有需要, 联系微信tsaievan.

观察者模式可以说是程序设计中最重要的模式, 在面向对象编程的过程中, 我们很大程度上都扮演了观察者的角色, 当 A 发生某种改变时, B 将执行某种操作, 这是一种很常见的模式, 甚至代表了我们整个世界的运转. 那么我们如何将 A 的改变,告知 B 呢?

打个很简单的比方,

这就是简单的通知机制

在 iOS 中, Foundation 框架为我们封装了一个通知中心的单例, 通过这个单例,我们可以去完成这种操作甚至传值(userInfo)

对于一个A 来说,可以将这个通知传给所有订阅了这个通知的人, 也就是说股票 A 要像所有买了这只股票的人告知其涨跌状况,如下图所示:

发布通知示意图

对于 B 来说,作为观察者,我当然也可以观察多个对象的变化, 就像 B 可以买多只股票一样

接收通知示意图

假如我现在有个需求, 第二个控制器要回传一个颜色信息给第一个控制器,并赋值给第一个控制器的 view, 怎么做?方法很多,用通知,无非就这么几步:

第一个控制器的代码

- (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];
}

完成效果:


完成效果

PS. 本人有若干成套学习视频, 包含Java, 数据结构与算法, iOS, 安卓, python, flutter等等, 如有需要, 联系微信tsaievan.

上一篇 下一篇

猜你喜欢

热点阅读