深入淺出Runtime (四) Runtime的實(shí)際應(yīng)用之一,字典轉(zhuǎn)模型

已更新
深入淺出Runtime (一) 什么是Runtime? 定義?
深入淺出Runtime (二) Runtime的消息機(jī)制
深入淺出Runtime (三) Runtime的消息轉(zhuǎn)發(fā)

引言

在我們開發(fā)中,經(jīng)常使用數(shù)據(jù)模型,模型分為:本地緩存模型、網(wǎng)絡(luò)下載模型、以及一些臨時(shí)存儲(chǔ)模型,其中網(wǎng)絡(luò)數(shù)據(jù)模型需要工程師將服務(wù)器的數(shù)據(jù)序列化,在網(wǎng)絡(luò)模型賦值的時(shí)候,我們所要做的方式有兩種:

  • 自己設(shè)計(jì)數(shù)據(jù)模型,將網(wǎng)絡(luò)中的數(shù)據(jù),手動(dòng)一一對(duì)應(yīng)的形式賦值給自己定義的模型

    • 優(yōu)點(diǎn):1.設(shè)計(jì)的模型根據(jù)自己的代碼架構(gòu)來實(shí)現(xiàn) 2.在迭代過程當(dāng)中會(huì)更順暢、更清楚業(yè)務(wù)邏輯、方便修改、更加靈活
    • 缺點(diǎn):1.開發(fā)周期會(huì)變慢 2.每次改動(dòng)的時(shí)候都需要自己手動(dòng)處理模型
  • 數(shù)據(jù)轉(zhuǎn)模型,根據(jù)服務(wù)器返回的數(shù)據(jù)規(guī)格,轉(zhuǎn)換成字典,在根據(jù)字典key=property(Name)的形式設(shè)計(jì)數(shù)據(jù)模型用runtime的形式一鍵生成實(shí)例數(shù)據(jù)模型(已賦值過后的數(shù)據(jù)模型)

    • 優(yōu)點(diǎn):1.敏捷式開發(fā) 2.添加新的數(shù)據(jù)時(shí)會(huì)更方便
    • 缺點(diǎn):1.嚴(yán)重依賴于服務(wù)器約定的數(shù)據(jù)規(guī)格 2.服務(wù)器數(shù)據(jù)改動(dòng)會(huì)增加代碼的工作量

我在序言中講了這么多干哈?

在實(shí)際開發(fā)中還是看實(shí)際情況而定,而不是我就認(rèn)定哪種好用哪個(gè),在需求不明確,數(shù)據(jù)不精簡的情況下,我的建議還是使用自建模型

今天重點(diǎn)要看的是字典怎么轉(zhuǎn)換成模型

簡單的字典轉(zhuǎn)模型

首先初始化一個(gè)字典

NSDictionary *dicTest = @{@"Name":@"飛翔",
                          @"Type":@"勵(lì)志",
                          @"Des":@"我要飛翔追逐夢(mèng)想!",
                          @"Motto":@"腳踏實(shí)地一步一個(gè)腳?。?
                          };

看到這種情況下,根據(jù)key來記錄Property的屬性名稱創(chuàng)建一個(gè)模型

@interface MyGame : NSObject
@property(nonatomic,copy)NSString *Name;
@property(nonatomic,copy)NSString *Type;
@property(nonatomic,copy)NSString *Des;
@property(nonatomic,copy)NSString *Motto;
@end

再然后我們需要用Runtime來進(jìn)行數(shù)據(jù)賦值,這個(gè)操作,我覺的最好的形式是放到NSObject的類擴(kuò)展中去,當(dāng)我們用到的時(shí)候?qū)⑦@個(gè)文件導(dǎo)入到數(shù)據(jù)模型中就可以直接使用

#import "NSObect+ThreegModel.h"
#import <objc/runtime.h>
#import <objc/message.h>
@implementation NSObject(ThreegModel)
+ (instancetype)GG_initWithDictionaryForModel:(NSDictionary *)dic{
    
    id myObj = [[self alloc] init];
    unsigned int outCount;     //獲取類中的所有成員屬性
    objc_property_t *arrPropertys = class_copyPropertyList([self class], &outCount);
    
    for (NSInteger i = 0; i < outCount; i ++) {
        
        //獲取屬性名字符串
        objc_property_t property = arrPropertys[i];
        //model中的屬性名
        NSString *propertyName = [NSString stringWithUTF8String:property_getName(property)];
        
        id propertyValue = dic[propertyName];
        if (propertyValue != nil) {
            [myObj setValue:propertyValue forKey:propertyName];
            
        }
        
    }
    //注意在runtime獲取屬性的時(shí)候,并不是ARC Objective-C的對(duì)象所有需要釋放
    free(arrPropertys);
    return myObj;
}
@end

個(gè)人博客地址:

深入淺出Runtime (四) Runtime的實(shí)際應(yīng)用之一,字典轉(zhuǎn)模型

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容