• KVO和通知中心


    苹果其实在语言层面为我们做了很多事,比如Category实现装饰模式的意图,target-action实现命令模式意图等等,对于观察者模式,苹果也提供了KVO和通知中心,给开发者提供了极大的便利。

    观察着模式即一个对象发出广播,然后某些对象可以在得知这个广播之后做相应的反应。

    KVO用来监控某个变量,是一种局部性的监听机制,使用方式如下:

    首先,为被检测的变量添加一个观察者:

    1 [被监测对象 addObserver:self forKeyPath:@"xxx" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:nil];

    然后再它的观察者类(这里是self)当中使用如下方法进行响应:

    1 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context;

    一个弊端在于,任何KVO方法都走这一个响应方法,那么就要在其中对KeyPath参数进行判断。

    严格来讲,KVO是一种属性AOP机制,属于子类代理模式。

    这里有一个坑,尽量不要用KVO监控作为TableView数据源的Dictionary,不然很可能会因为莫名其妙触发了N次纠结。

    第二种方式通知中心是一个全局单例,使用方式如下:

    首先,在通知发送端:

    1 NSNotification *notify = [NSNotification notificationWithName:@"xxx" object:self];
    2 [[NSNotificationCenter defaultCenter] postNotification: notify];

    通知是以key:object的方式定义的,将它post到通知中心的单例对象当中。

    在通知响应端,首先注册:

    1 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(responseNotify:) name:@"xxx" object:nil];

    然后实现响应:

    1 - (void)responseNotify:(NSNotification *)sender {
    2     if ([sender.name isEqualToString:@"LoadDataStart"]) {
    3     ...

    使用起来还是很简单的,不需要像java那样写很多的类。

  • 相关阅读:
    葵花宝典,参考学习网站收藏
    安卓工具
    马帮
    C89:vs输出调试信息
    OSG:中级篇 拖拽器类
    OSG:幼儿园篇 第六章 碰撞检测类
    OSG:幼儿园篇 第三章 节点坐标变换类
    OSG:幼儿园篇 第五章 界面交互类
    C++11:智能指针
    OSG:幼儿园篇 第四章 节点回调类
  • 原文地址:https://www.cnblogs.com/Steak/p/3772016.html
Copyright © 2020-2023  润新知