前言
最近公司要求做一個SDK供三方使用廷区,在制作過程中就碰到一個問題,因為要進行網(wǎng)絡請求獲取數(shù)據(jù)起愈,并且為了避免沖突要盡量不使用三方框架矛纹,所以平時常用的數(shù)據(jù)轉(zhuǎn)模型框架MJExtension就沒有使用,而是用系統(tǒng)的KVC進行簡單處理霜医,為什么數(shù)據(jù)要轉(zhuǎn)模型齿拂,這個就不多陳述了,好處不言而喻肴敛。
KVC
KVC的介紹可以參考iOS開發(fā)技巧系列---詳解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
- 我們在進行數(shù)據(jù)轉(zhuǎn)模型時最重要的一個方法就是
setValuesForKeysWithDictionary
他會遍歷字典中的每一個key,然后進行賦值砸狞, - 你可以在
- (void)setValue:(id)value forKey:(NSString *)key
這個方法中監(jiān)聽到每一個key,有時候后臺命名不符合我們或者是一個關鍵字镀梭,那么這時候就要把這個key值進行轉(zhuǎn)換刀森,例如:這里將id->pid; - 方法
- (void)setValue:(id)value forUndefinedKey:(NSString *)key
如果key在model中沒有定義,則會走到這里报账,要不然會崩潰研底,所以這個方法必須重寫。 -
實現(xiàn)效果,未定義的key打印了出來透罢,model也賦值成功
普通model測試
帶有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;
//男/女(根據(jù)sex進行處理后的結果)
@property (nonatomic, copy) NSString *sexStr;
//擁有的Dog(數(shù)組)
@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{
//在這里處理數(shù)組轉(zhuǎn)換
if([key isEqualToString:@"dogs"]){
NSMutableArray *array = [NSMutableArray array];
for (NSDictionary *dic in value){
DogModel *model = [[DogModel alloc] initWithDictionary:dic];
[array addObject:model];
}
//注意這個地方不能用變量名dogs,一定要用value,不然轉(zhuǎn)換后的模型則沒有賦值進去
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
- 數(shù)組的處理主要在方法
- (void)setValue:(id)value forKey:(NSString *)key
中羽圃,就是將拿到的數(shù)組進行遍歷乾胶,然后賦值到DogModel存入新數(shù)組返回; - 對于Bool類型的處理朽寞,在獲得數(shù)據(jù)是0是自動為NO识窿,非0即為YES;
- 對于后臺給的type根據(jù)數(shù)值判斷的我們可以在Model里進行處理脑融,這里sex 0-男 1-女喻频,自己定義了一個屬性sexStr,根據(jù)需要對sex進行了轉(zhuǎn)化吨掌,如果在哪里需要顯示男女的話可以直接通過sexStr獲得半抱,減少了業(yè)務代碼里面的數(shù)據(jù)處理脓恕。
- 實現(xiàn)結果
帶數(shù)組類型Model處理
最后附上demo地址:MCModelDemo