IOS學(xué)習(xí)筆記八(KVO)

1、KVO介紹
 

KVO機(jī)制NSKeyValueObserving協(xié)議支持,NS遵循了這個(gè)協(xié)議 ,所以NSObject的子類都可使用協(xié)議中的方法,下面方法可以注冊(cè)監(jiān)聽

添加監(jiān)聽器

addObserver: forKeyPath: options: context:

刪除監(jiān)聽

removeObserver: forKeyPath:

//重寫下面的方法,當(dāng)數(shù)據(jù)發(fā)生變化的時(shí)候會(huì)回調(diào)這個(gè)函數(shù)

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context

 
2、測試代碼

FKItemView.h

    #ifndef FKItemView_h
    #define FKItemView_h
    #import <Foundation/Foundation.h>
    #import "FKItem.h"
     
    @interface FKItemView : NSObject
    @property (nonatomic, weak) FKItem *item;
    -(void)showItemInfo;
    @end
     
     
    #endif /* FKItemView_h */


FKItemView.m


    #import <Foundation/Foundation.h>
    #import "FKItemView.h"
     
    @implementation FKItemView
    @synthesize item = _item;
     
    -(void)showItemInfo
    {
        NSLog(@"item物品名為:%@,物品價(jià)格為:%d", self.item.name, self.item.price);
    }
    //自定義設(shè)置item
    -(void)setItem:(FKItem *)item
    {
        self->_item = item;
    //    self.item = item;
        //為item添加監(jiān)聽器,監(jiān)聽item的name屬性的改變
        [self.item addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:nil];
        [self.item addObserver:self forKeyPath:@"price" options:NSKeyValueObservingOptionInitial context:nil];
        
    }
    //重寫方法,當(dāng)監(jiān)聽的數(shù)據(jù)模型發(fā)生改變時(shí)候,就會(huì)回調(diào)這個(gè)方法
    -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
    {
        NSLog(@"observeValueForKeyPath方法被調(diào)用了");
        NSLog(@"被修改的keyPath為:%@", keyPath);
        NSLog(@"被修改的對(duì)象為:%@", object);
        NSLog(@"新被修改的屬性值為:%@", [change objectForKey:@"new"]);
        NSLog(@"被修改的上下文為:%@", context);
    }
     
    -(void)dealloc
    {
        [self.item removeObserver:self forKeyPath:@"name"];
        [self.item removeObserver:self forKeyPath:@"price"];
    }
    @end

main.m

    #import "FKItemView.h"
     
    int main(int argc, char * argv[]) {
        @autoreleasepool {
            FKItemView *itemView = [FKItemView new];
            FKItem *item = [FKItem new];
            itemView.item = item;
            [itemView showItemInfo];
            item.name = @"chencaifeng";
            item.price = 79;
            
        }
    }


3、運(yùn)行結(jié)果

    observeValueForKeyPath方法被調(diào)用了
    被修改的keyPath為:name
    被修改的對(duì)象為:<FKItem: 0x600000035360>
    新被修改的屬性值為:chencaifeng
    被修改的上下文為:(null)
    observeValueForKeyPath方法被調(diào)用了
    被修改的keyPath為:price
    被修改的對(duì)象為:<FKItem: 0x600000035360>
    新被修改的屬性值為:(null)
    被修改的上下文為:(null)

 

 


作者:chen.yu
深信服三年半工作經(jīng)驗(yàn),目前就職游戲廠商,希望能和大家交流和學(xué)習(xí),
微信公眾號(hào):編程入門到禿頭 或掃描下面二維碼
零基礎(chǔ)入門進(jìn)階人工智能(鏈接)