• 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得知发生了哪种变化来做对应的处理。



  • 相关阅读:
    sendmessage参数
    combobox添加选项
    sql数据库时间转换convert
    Javascript知识四(DOM)
    Javascript知识三
    JavaScript知识(二)
    JavaScript知识(一)
    三层架构
    ADO知识的运用二(Day 28)
    SQL知识三(Day 27)
  • 原文地址:https://www.cnblogs.com/yxysuanfa/p/7148898.html
Copyright © 2020-2023  润新知