zoukankan      html  css  js  c++  java
  • kvc VS kvo

    Kvo是Cocoa的一个重要机制,它主要是用于对一个属性的新旧值的监控。

    例如说依据A(数 据类)的某个属性值变化,B(view类)中的某个属性做出对应变化。对于MVC,kvo应用的地方很广泛。


    使用kvo流程:

    1 注冊:

    -(void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void*)context
    keyPath就是要观察的属性值,options给你观察键值变化的选择。而context方便传输你须要的数据

    2 实现变化方法:

    -(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
    change:(NSDictionary *)change context:(void*)context
    change里存储了一些变化的数据,比方变化前的数据。变化后的数据


    KVC是一种间接訪问对象属性(用字符串表征)的机制,而不是直接调用对象的accessor方法或是直接訪问成员对象。


    key就是确定对象某个值的字符串,它通常和accessor方法或是变量同名。Key path就是以“.”分隔的key。由于属性值也能包括属性。


    获取属性值时能够通过valueForKey:的方法,设置属性值用setValue:forKey:。

    与此同一时候,KVC还对没有定义的属性值定义了 valueForUndefinedKey:,你能够重载以获取你要的实现

    在O-C 2.0引入了property。我们也能够通过.运算符来訪问属性,比如:

    @property NSInteger number;

    instance.number =5;
    [instance setValue:[NSNumber numberWithInteger:5] forKey:@"number"];

    以上介绍了通过KVC来获取/设置属性。接下来要说明下实现KVC的訪问器方法。

    -key:。以及setKey:(使用的name convention和setter/getter命名一致)。对于没有定义的属性能够用setNilValueForKey:。

    在ios中,array往往做为tableview的数据源,比如:

     如果我们已经有N条数据,在进行了某个操作后,有在原先的数据后多了几条记录。或者对N中的某些数据进行更新替换。不使用KVC我们能够使用 reloadData方法或reloadRowsAtIndexPaths。前一种的弊端在于如果N非常大消耗就非常大。试想你仅仅加入了几条数据却要重载之前 N数据。

    后一种方法的不足在于代码会非常冗余,你要一次计算各个indexPath再去reload。并且还要提前想好到底在哪些情况下会引起数据更新,

    倘若使用了KVC。你将不用关心追加或是更新多少条数据。

    实现insertObject:inKeyAtIndex:或者insertKey:atIndexes。同一时候在kvo中我们能够通过change这个dictionary得知发生了哪种变化来做对应的处理。



  • 相关阅读:
    (Java实现) 洛谷 P1603 斯诺登的密码
    (Java实现) 洛谷 P1036 选数
    (Java实现) 洛谷 P1036 选数
    (Java实现) 洛谷 P1012 拼数
    (Java实现) 洛谷 P1012 拼数
    (Java实现) 洛谷 P1028 数的计算
    (Java实现) 洛谷 P1028 数的计算
    (Java实现) 洛谷 P1553 数字反转(升级版)
    8.4 确定两个日期之间的月份数或年数
    (Java实现) 洛谷 P1553 数字反转(升级版)
  • 原文地址:https://www.cnblogs.com/yxysuanfa/p/7148898.html
Copyright © 2011-2022 走看看