iOS中的KVC与KVO

一、对于KVC模式(Key Value Coding)(http://my.oschina.net/caijunrong/blog/510701):

1、其实在实际开发中用得比较多得就是:接收到json数据之后,通过解析,解析成NSDictionary,然后再把字典对应的字段建立一个Model,在Model里面自定义一个类方法+(instancetype)modelWithDictionary:(NSDictionary *)keyDictionary方法中调用从而达到我们想要的效果,将字典装成Model。


 setValuesForKeyWithDictionary 方法


2、然后对于一些想要特殊处理的字段可以调用以下方法来进行特殊处理,比如里面有些key是字典类型,则可以通过以下方式搞定:

-(void) setValue:(id)value forKey:(NSString *)key 
{ 
  if([key isEqualToString:@"products"]) 
  { 
    for(NSMutableDictionary *productDict in value) 
    { 
      Prodcut *product = [[Product alloc] initWithDictionary:prodcutDict]; 
      [self.products addObject:product]; 
    } 
  } 
}



3、还有一种情况,就是里面的Key压根就没定义,可以通过重写以下这个方法来重新把key和value对应上号:

- (void)setValue:(id)value forUndefinedKey:(NSString *)key 
{ 
    if([key isEqualToString:@"nameXXX"]) 
        self.name = value; 
    if([key isEqualToString:@"ageXXX"]) 
        self.age = value; 
    else 
        [super setValue:value forKey:key]; 
}



二、对于KVO设计模式(KVO的简单使用):

Key Value Observing, 是一种observer 模式用于监听属性的变化

用addObserver:forKeyPath:options:context:去start observer

用removeObserver:forKeyPath:context去stop observer

回调就是observeValueForKeyPath:ofObject:change:context:。

KVO 的实现也依赖于 Objective-C 强大的 Runtime 。

以下是对于KVO的实验操作 storyboard已截图


//
//  ViewController.m
//  WebTest
//
//  Created by Tree on 16/2/26.
//  Copyright © 2016年 Tree. All rights reserved.
//

#import "ViewController.h"
#import "DataModel.h"

@interface ViewController ()

@property (weak, nonatomic) IBOutlet UILabel *TextLabel;

@property (nonatomic, strong) DataModel *data;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    
    DataModel *data = [[DataModel alloc] init];
    
    [data setValue:@"KVO 初始化" forKey:@"labelText"];
    
    [data addObserver:self forKeyPath:@"labelText" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL];
    
    self.data = data;
    
    self.TextLabel.text = [data valueForKey:@"labelText"];

}

- (IBAction)addBtnDidClick:(id)sender {
    
    [self.data setValue:@"KVO测试成功" forKey:@"labelText"];
    
}

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

    if ([keyPath isEqualToString:@"labelText"]) {
        
        self.TextLabel.text = [self.data valueForKey:@"labelText"];
        
    }

}

- (void)dealloc{
    
    [self removeObserver:self forKeyPath:@"labelString"];

}

@end


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值