原理篇iOS点点滴滴iOS Developer

iOS 利用KVC进行数据转模型

2017-12-15  本文已影响429人  calary

前言

最近公司要求做一个SDK供三方使用,在制作过程中就碰到一个问题,因为要进行网络请求获取数据,并且为了避免冲突要尽量不使用三方框架,所以平时常用的数据转模型框架MJExtension就没有使用,而是用系统的KVC进行简单处理,为什么数据要转模型,这个就不多陈述了,好处不言而喻。

KVC

KVC的介绍可以参考iOS开发技巧系列---详解KVC(我告诉你KVC的一切)文章讲的很详细,下面我们进入我们的主题

普通model

我们先来看一个普通DogModel类

//DogModel.h
#import <Foundation/Foundation.h>

@interface DogModel : NSObject
@property (nonatomic, copy) NSString *pid;//id
@property (nonatomic, copy) NSString *name;//名子
@property (nonatomic, assign) int age;//年龄
//初始化方法
- (instancetype)initWithDictionary:(NSDictionary *)dic;
@end
//DogModel.m
#import "DogModel.h"

@implementation DogModel
- (instancetype)initWithDictionary:(NSDictionary *)dic{
    if (self = [super init]){
        [self setValuesForKeysWithDictionary:dic];
    }
    return self;
}

- (void)setValue:(id)value forKey:(NSString *)key{
    //在这里更改key
    if([key isEqualToString:@"id"]){
        key = @"pid";
    }
    [super setValue:value forKey:key];
}
//冗错处理,如果有未定义的字段的话就会走到这里,不重写的话会引起崩溃
- (void)setValue:(id)value forUndefinedKey:(NSString *)key{
    NSLog(@"value:%@,undefineKey:%@",value,key);
}
@end

带有NSArray的model

先看下我们的PersonModel类

//PersonModel.h
#import <Foundation/Foundation.h>
#import "DogModel.h"

@interface PersonModel : NSObject
@property (nonatomic, copy) NSString *name;
//是否是小孩(<14岁)
@property (nonatomic, assign) BOOL isChild;
//性别(0-男 1-女)
@property (nonatomic, assign) int sex;
//男/女(根据sex进行处理后的结果)
@property (nonatomic, copy) NSString *sexStr;
//拥有的Dog(数组)
@property (nonatomic, strong) NSArray <DogModel *> *dogs;

//初始化方法
- (instancetype)initWithDictionary:(NSDictionary *)dic;
@end

//PersonModel.m
#import "PersonModel.h"
@implementation PersonModel
- (instancetype)initWithDictionary:(NSDictionary *)dic{
    if (self = [super init]){
        [self setValuesForKeysWithDictionary:dic];
    }
    return self;
}

- (void)setValue:(id)value forKey:(NSString *)key{
    //在这里处理数组转换
    if([key isEqualToString:@"dogs"]){
        NSMutableArray *array = [NSMutableArray array];
        for (NSDictionary *dic in value){
            DogModel *model = [[DogModel alloc] initWithDictionary:dic];
            [array addObject:model];
        }
        //注意这个地方不能用变量名dogs,一定要用value,不然转换后的模型则没有赋值进去
        value = array;
    }
    [super setValue:value forKey:key];
}
//冗错处理,如果有未定义的字段的话就会走到这里,不重写的话会引起崩溃
- (void)setValue:(id)value forUndefinedKey:(NSString *)key{
    NSLog(@"value:%@,undefineKey:%@",value,key);
}

//重写sexStr的get方法
- (NSString *)sexStr{
    if (self.sex == 0){
        return @"男";
    }else {
        return @"女";
    }
}
@end
带数组类型Model处理

最后附上demo地址:MCModelDemo

上一篇下一篇

猜你喜欢

热点阅读