已更新
深入淺出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è)人博客地址: