iOS KVO的一些理解和使用

先说一些关于@interface的(复制了一个说的很完整的)

此@interface部分为类扩展(extension)。

其被设计出来就是为了解决两个问题的,其一,定义类私有方法的地方。其二,实现public readonly,private readwrite的property(意思是在h头文件中定义一个属性对外是readonly的,但在类的内部希望是可读写的,所以可以在m源文件中的@interface部分重新定义此属性为readwrite,此时此属性对外是只读的,对内是读写的)。

此外,也可在此部分申明变量和属性,但申明的变量,属性和方法均为私有的,只能够被当前类访问,相当于private。

 

我的例子使用KVO主要是需求上有页面的值需要动态变化,KVO监听和delegate配合使用完美解决这类问题。当然是有更好的省内存的写法,我这里使用KVO+delegate为例

KVO的使用大致分三步

1

addObserver:self
           forKeyPath:@"xxx"
              options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld
              context:NULL];

 给你的属性添加监听。需要注意的是KVO实际是观察的地址变化,如果这里是数组或者float等类型,kvo是实现不了得

注意2:如果使用string类型这个非常特殊的类型的话,keypath就是你的属性名,[self addobserver...]这样的方式来调用

tips:如果发生莫名的崩溃,请去检查是否初始化你的string类型的属性

 

2

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context {
    if ([keyPath isEqualToString:@"xxx"]) {
        if (self.delegate) {
            if ([self.delegate respondsToSelector:@selector(CartConfirmOrderExpressAddTableViewCell:expressAddPrice:)]) {
                [self.delegate CartConfirmOrderExpressAddTableViewCell:self expressAddPrice:self.expressAddPrice];
            }
        }
    }   
}

 这是监听的实现,当监听到属性变化时调用。这里的delegate可以先不看,是配合kvo实现,下面会写出来

 

3

        [self removeObserver:self forKeyPath:@"expressAddPrice"];

 remove是必须实现的,写在-dealloc里面

 

以上是kvo三步,可以先把方法写出来,实现部分在写完delegate的定义只有填写。kvo的实现部分是为了触发delegate的实现,delegate的实现里面完成我们的需求

delegate部分

@protocol xxxDelegate <NSObject>

 在.h定义一个delegate

- (void)xxxxTableViewCell:(CartConfirmOrderExpressAddTableViewCell *)cell expressAddPrice:(NSInteger )price;

 定义方法,这里根据自己需要写,但是一般会把cell传过去,可以得到cell的分区和行的定位 后面那个就是传过去改变的属性

@property(nonatomic, weak) id<CartConfirmOrderExpressAddDelegate> delegate;
这个别忘了,留给你的子类遵守

然后就是进入controller里面,遵守下协议之后,找个地方实现协议的内容了。

 

这样KVO+delegate的监听就完成了

posted on 2016-03-21 15:32  durantm  阅读(279)  评论(0编辑  收藏  举报

导航