KVC/KVO/NSNotificationCenter

KVC(key-value coding)

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    _objectb = [[ObjectB alloc]init];
    _objectb.str = @"sss";
    [_objectb addObserver:self forKeyPath:@"str" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:nil];
    _objectb.str = @"sss2";
}

// 第二步,实现接收通知的接口方法
- (void)observeValueForKeyPath:(NSString *)keyPath
                      ofObject:(id)object
                        change:(NSDictionary<NSKeyValueChangeKey,id> *)change
                       context:(void *)context {
    // 这里最好判断一下object的类型和keyPath的值,不符合则交给父类处理
    if ([object isKindOfClass:[ObjectB class]] && [keyPath isEqualToString:@"str"]) {
        NSLog(@"%@", change);  // 这里可以读取到 new = 999
    } else {
        [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
    }
}

// 第三步,移除观察者。
- (void) dealloc {
    [_objectb removeObserver:self forKeyPath:@"str"];
}

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    _objectb.str = @"999";
}

KVO可以在MVC模式中得到很好的应用。因为当Model发生变化时,通过KVO可以很方便地通知到Controller,从而通过Controller来改变View的展示。所以说 KVO是解决Model和View同步的好办法。



NSNotificationCenter

1、创建通知,最好在viewDidLoad的方法中创建

- (void)viewDidLoad {
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserver:self   selector:@selector(tongzhi:) name:@"tongzhi" object:nil];
}

- (void) tongzhi:(NSNotification *)notification{
    NSLog(@"通知过来的 - dic = %@",notification.object);
}

2、发送通知

    NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@"324234",@"bankId",@"某某银行",@"bankName", nil];
    [[NSNotificationCenter defaultCenter] postNotificationName:@"tongzhi" object:dic];

3、移除通知,由那个控制器创建由那个控制器移除,谁创建谁移除,最好在dealloc方法中移除,

-(void)dealloc{
     //第一种方法.这里可以移除该控制器下的所有通知
     // 移除当前所有通知
    NSLog(@"移除了所有的通知");
    [[NSNotificationCenter defaultCenter] removeObserver:self];

     //第二种方法.这里可以移除该控制器下名称为tongzhi的通知
    //移除名称为tongzhi的那个通知
    NSLog(@"移除了名称为tongzhi的通知");
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"tongzhi" object:nil];
}

系统自带的通知有:

UIDevice通知...
UIDeviceOrientationDidChangeNotification // 设备旋转
UIDeviceBatteryStateDidChangeNotification // 电池状态改变
UIDeviceBatteryLevelDidChangeNotification // 电池电量改变
UIDeviceProximityStateDidChangeNotification // 近距离传感器(比如设备贴近了使用者的脸部)

键盘通知...

//应用程序进入到后台的通知
//UIApplicationDidEnterBackgroundNotification 程序进图后台的通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationGotoBackGround) name:UIApplicationDidEnterBackgroundNotification object:nil];
//接受到键盘frame改变的通知
//UIKeyboardWillChangeFrameNotification 键盘frame将要改变的通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardFrameChange:) name:UIKeyboardWillChangeFrameNotification object:nil];

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,868评论 18 139
  • 在编程中,最常见的就是程序的流程取决于你所使用的各种变量和属性的值,根据变量和属性的值确定后面运行的代码,有时会检...
    pro648阅读 1,656评论 2 27
  • 上半年有段时间做了一个项目,项目中聊天界面用到了音频播放,涉及到进度条,当时做android时候处理的不太好,由于...
    DaZenD阅读 3,038评论 0 26
  • 1.KVC 关于 KVC 和 KVO ,我之前的总结文章有写过,但是趋于表面,没有探究其内部真正的实现原理和进阶用...
    Liberalism阅读 1,112评论 0 5
  • 本文转自:Objective-C中的KVC和KVO. KVC KVO2.1. Registering for Ke...
    0o冻僵的企鹅o0阅读 427评论 0 3