登录 立即注册
金钱:

Code4App-iOS开发-iOS 开源代码库-iOS代码实例搜索-iOS特效示例-iOS代码例子下载-Code4App.com

查看: 197|回复: 6

iOS平台基于KVC的JSON与数据对象绑定,ios kvc和kvo模式

[复制链接]

288

主题

566

帖子

1387

金钱

手工艺人

发表于 2018-1-11 11:41:19 | 显示全部楼层 |阅读模式

        vc的json与数据对象绑定">

        在iOS平台上,要操纵JSON数据并不困难,但是,我们还有更简单的解决方案,使用KVC,全称是Key-Value Coding。

        假设开发者(你)开发了一款应用,它的数据来自于外部对Web服务,要从Web服务中取回一些JSON数据,数据如下:

[Java] 查看源文件 复制代码
{count: 3, sum: 9.0, average: 3.0}

        要从服务器中获取数据,需要调用NSJSONSerializationalization的JSONObjectWithData方法,并从解序列化的字典中取回数据,比如:

[Java] 查看源文件 复制代码
NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];

NSLog(#%d, [[dictionary objectForKey:#count] intValue]); // prints 3Rd
NSLog(#%.1f, [[dictionary objectForKey:#sum] doubleValue]); // prints 9.0
NSLog(#%.1f, [[dictionary objectForKey:#average] doubleValue]); // prints 3.0

        但是,上面的值比较分散,在做应用开发时,或许想与强类型的数据对象直接交互,这样会更加简单。比如,你或许想要创建一个Statistics统计类,来代表通过Web服务返回的数据类型,如下:

[Java] 查看源文件 复制代码
#interface Statistics : NSObject

#property (nonatomic) int count;
#property (nonatomic) double sum;
#property (nonatomic) double average;

#end

        然后可以从字典中提取值来填充以上的对象:

[Java] 查看源文件 复制代码
Statistics *statistics = [[Statistics alloc] init];

statistics.count = [[dictionary objectForKey:#count] intValue];
statistics.sum = [[dictionary objectForKey:#sum] doubleValue];
statistics.average = [[dictionary objectForKey:#average] doubleValue];

        为了让事情更简单,避免代码重复,可以把这段代码放在Statistics类的初始化中:

[Java] 查看源文件 复制代码
- (instancetype)initWithDictionary: (NSDictionary *)dictionary {
    self = [super init];
    if (self) {
        self.count = [[dictionary objectForKey:#count] intValue];
        self.sum = [[dictionary objectForKey:#sum] doubleValue];
        self.average = [[dictionary objectForKey:#average] doubleValue];
    }
    return self;
}

        代码绑定JSON响应到Statistics实例,如下:

[Java] 查看源文件 复制代码
Statistics *statistics = [[Statistics alloc] initWithDictionary:dictionary];

        在任何情况下,你都可以使用此强类型的数据对象的属性来访问从服务器返回的数据:

[Java] 查看源文件 复制代码
NSLog(#%d, statistics.count); // prints 3
NSLog(#%.1f, statistics.sum); // prints 9.0
NSLog(#%.1f, statistics.average); // prints 3.0

        上面的代码工作正常,而且把JSON数据映射到强类型的数据对象是非常适合的方法。

        但是,还有更简单的解决方案:KVC。NSObject的setValuesForKeysWithDictionary:方法可用于将给定字典上所有的值自动映射到对象的属性。使用这种方法,initWithDictionary:方法简化如下:

[Java] 查看源文件 复制代码
- (instancetype)initWithDictionary: (NSDictionary *)dictionary {
    self = [super init];
    if (self) {
        [self setValuesForKeysWithDictionary:dictionary];
    }
    return self;
}

        无需手动映射字典到项到属性值中,使用适合的名字和类型来声明属性就足够了,下面的代码中Swift中工作良好:

[Java] 查看源文件 复制代码
class Statistics: NSObject {
    var count: Int = 0
    var sum: Double = 0
    var average: Double = 0
    init(dictionary: [String:AnyObject]) {
        super.init()
        setValuesForKeysWithDictionary(dictionary);
    }
}

        此外,如果你需要自定义属性名或属性值的分配,那么可以简单的重写setValue:forKey:方法。比如,假设服务器以不同的名字来引用平均属性:

[Java] 查看源文件 复制代码
{count: 3, sum: 9.0, mean: 3.0}

        可以重写setValue:forKey:方法,确保值能正确的映射到属性中:

[Java] 查看源文件 复制代码
- (void)setValue: (id)value forKey: (NSString *)key {
    if ([key isEqual:#mean]) {
        key = #average;
    }
    [super setValue:value forKey:key];
}

        最后,你可以使用KVC来忽略你不想要的值。比如,假设服务器的响应还包含了名为“median”的属性:

[Java] 查看源文件 复制代码
{count: 3, sum: 9.0, average: 3.0, median: 3.0}

        由于Statistics类没有定义“Median”属性,那么setValuesForKeysWithDictionary:方法会抛出NSUnknownKeyException异常。要避免抛出此异常,可以简单的重写setValue:forUndefinedKey::方法。

[Java] 查看源文件 复制代码
- (void)setValue: (id)value forUndefinedKey: (NSString *)key {
    // No-op
}

        


                                               

15

主题

7104

帖子

1592

金钱

手工艺人

发表于 2018-1-11 11:53:04 | 显示全部楼层
感谢分享,code4app有你更精彩

21

主题

7160

帖子

2482

金钱

手工艺人

发表于 2018-1-11 12:02:07 | 显示全部楼层
感谢分享,code4app有你更精彩

23

主题

7123

帖子

1050

金钱

iOS大神

Rank: 6Rank: 6

分享大神

发表于 2018-1-11 12:16:17 | 显示全部楼层
mark,收藏了

0

主题

7102

帖子

-523

金钱

限制会员

发表于 2018-1-11 12:20:53 | 显示全部楼层
感谢分享,code4app有你更精彩

16

主题

7148

帖子

1258

金钱

手工艺人

发表于 2018-1-11 12:30:41 | 显示全部楼层
感谢分享,楼主V5~

21

主题

7127

帖子

2549

金钱

手工艺人

发表于 2018-1-11 12:47:37 | 显示全部楼层
感谢分享,code4app有你更精彩
*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

关闭

每日头条

通过邮件订阅最新 Code4App 信息
上一条 /4 下一条

广告投放| Github|申请友链|手机版|Code4App ( 粤ICP备15117877号-1 )

快速回复 返回顶部 返回列表