Hello KVO,相见恨晚!

KVO这东西,早就听说过,也看过很多相关的文章,知道是用来监听一个类里面的一个值改变,然后执行点儿运作的,只是看过的文章都讲的很理论很复杂,以至于只是知道个大概:设置皮肤统一换背景的时候用它。终于我也遇到了这样的一个场景:用户登陆成功以后,需要获取用户状态,根据不同的用户状态要展示不同的界面,而且还有一点:用户状态是变的。没想到用KVO的方式很优雅的就实现了这个东东。因为我取到用户的数据是保存在NSUserDefault里的,所以基于KVO我只需要监听NSUserDefault里的这个值的改变就可以了

[NDSUD addObserver:self
        forKeyPath:@"CurentUserOnLineInformation"
           options:NSKeyValueObservingOptionNew
           context:nil];

上面的代码可以搁在init里,也可以搁到ViewDidLoad里。然后还要在这个文件里实现这个方法

- (void)observeValueForKeyPath:(NSString *)keyPath
                      ofObject:(id)object
                        change:(NSDictionary *)change
                       context:(void *)context{
  if ([keyPath isEqualToString:@"CurentUserOnLineInformation"]) {
    NSDictionary *_NewValue = [change valueForKey:@"new"];
    if ([_NewValue isKindOfClass:[NSDictionary class]]) {
      //用户登陆或者续期了
    }
    else{
      //用户登出
    }
  }
}

没想到KVO这么简单就实现了,就像NSUserDefault一样,很方便,很好使。
扩展一下,两个页面间传值现在是不是又多了一个选择?
再扩展一下:像这样在一个地方定义一个东西,再到另一个地方去实现一个方法,总是不那么易读易维护,So,还是上Block吧:)
搜索了一下,发现基于KVO的block,实现很多,试了一遍,推荐使用这个:kvo-block-binding

[NDSUD addObserverForKeyPath:@"CurentUserOnLineInformation"
                       owner:self
                     options:NSKeyValueObservingOptionNew
                       block:^(id observed, NSDictionary *change) {
                         NSLog(@"%@",change);

                       }];

这样就简单易读多了。移除的方法:

[NDSUD removeAllBlockBasedObserversForOwner:self];

为了让你的工程更易于维护,实现更优雅,建议多用Block,多用KVO!

转载请注明: 转自Rainbird的个人博客
   本文链接: Hello KVO,相见恨晚!


相关博文

    分享到:

About rainbird

IOS攻城狮
This entry was posted in IOS开发, Mac开发 and tagged , , , , , , , . Bookmark the permalink.

发表评论