iOS KVO和KVC及广播

来源:互联网 发布:魅族6手机备份数据 编辑:程序博客网 时间:2024/06/17 03:40

KVO和KVC

  • 设置监听
    [object addObserver:observer forKeyPath:属性名 options: option context:context]
参数 意义 object 要观察的属性所属实例,这里可以是 self,也可以是当前类的成员变量或者属性 observer 观察者,一般是 self 属性名 要监听变化的属性名称或者成员变量名称 option 监听设置项。可以使用“|”来使用多个值。如: NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context 监听到变化时要传递给对应函数的上下文信息。可以是任意类型对象或 nil
  • 属性改变
    在observer里实现

    <ul><li>(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context

    change字典常用的key形如:NSKeyValueChange*

    注意:
    1. 如果是监听的属性改变,并且自己实现 get 和 set 方法,这是需要使用 kvc 的方式来赋值,否则不能监听到值改变
    2. 如果是监听的属性改变,并且自己实现 get 和 set 方法,需要使用 @synthesize 来将“属性名”和“_属性名”关联起来

广播

  • 接收广播
    [[NSNotificationCenter defaultCenter] addObserver:observer selector:@selector(functionName) name:broadcastName object:sender];
参数 意义 observer 广播接收者 functionName 收到广播后要调用的函数 broadcastName 要接收广播的名称 sender 只接收带有指定对象“sender”的广播。这里一般使用 nil


  • 移除广播接收器
    [[NSNotificationCenter defaultCenter] removeObserver:observer name:broadcastName object:sender];

  • 发送广播
    [[NSNotificationCenter defaultCenter] postNotificationName:broadcastName object:data userInfo:dicUserInfo];

参数 意义 broadcastName 广播名称 data 可以通过notification.object获取 dicUserInfo 可以携带更多信息。通过notification.userInfo获取


这里比较有意思的是发送广播和接收广播时候的 object 参数。使用这个参数可以实现广播和接受者 1-1 匹配。
一般情况下我们会把发送和接收的 object 都设置为 nil。这样的效果是发送的广播所有人都可以接收,接收者也可以接收任何对象发送的广播。
假设有一个对象 A,发送广播的时候如果把 object 设置成 A,则只有把 object 同样设置为 A 的接收者才可以接收到这条广播。

相关文章

NSNotificationCenter 的使用详解
OC学习篇之—通知(NSNotificationCenter)
NSNotificationCenter消息通信机制介绍(KVO)

0 0