iOS 利用KVC進行數(shù)據(jù)轉(zhuǎn)模型

前言

最近公司要求做一個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

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末膜宋,一起剝皮案震驚了整個濱河市窿侈,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌秋茫,老刑警劉巖史简,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異肛著,居然都是意外死亡圆兵,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門枢贿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來殉农,“玉大人,你說我怎么就攤上這事局荚〕剩” “怎么了?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵耀态,是天一觀的道長轮傍。 經(jīng)常有香客問我,道長首装,這世上最難降的妖魔是什么创夜? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮仙逻,結果婚禮上驰吓,老公的妹妹穿的比我還像新娘。我一直安慰自己系奉,他們只是感情好棚瘟,可當我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著喜最,像睡著了一般偎蘸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瞬内,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天迷雪,我揣著相機與錄音,去河邊找鬼虫蝶。 笑死章咧,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的能真。 我是一名探鬼主播赁严,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼扰柠,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了疼约?” 一聲冷哼從身側響起卤档,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎程剥,沒想到半個月后劝枣,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡织鲸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年舔腾,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片搂擦。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡稳诚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出瀑踢,到底是詐尸還是另有隱情扳还,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布丘损,位于F島的核電站普办,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏徘钥。R本人自食惡果不足惜衔蹲,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望呈础。 院中可真熱鬧舆驶,春花似錦、人聲如沸而钞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽臼节。三九已至撬陵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間网缝,已是汗流浹背巨税。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留粉臊,地道東北人草添。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像扼仲,于是被迫代替她去往敵國和親远寸。 傳聞我的和親對象是個殘疾皇子抄淑,可洞房花燭夜當晚...
    茶點故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容

  • KVC(Key-value coding)鍵值編碼,單看這個名字可能不太好理解驰后。其實翻譯一下就很簡單了肆资,就是指iO...
    朽木自雕也閱讀 1,560評論 6 1
  • KVC(Key-value coding)鍵值編碼,單看這個名字可能不太好理解倡怎。其實翻譯一下就很簡單了迅耘,就是指iO...
    黑暗中的孤影閱讀 49,740評論 74 441
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結起來就是把...
    Dove_iOS閱讀 27,150評論 30 470
  • KVC(Key-value coding)鍵值編碼贱枣,單看這個名字可能不太好理解监署。其實翻譯一下就很簡單了,就是指iO...
    Fendouzhe閱讀 675評論 0 6
  • KVC簡單介紹 KVC(Key-value coding)鍵值編碼纽哥,就是指iOS的開發(fā)中钠乏,可以允許開發(fā)者通過Key...
    公子無禮閱讀 1,394評論 0 6