最近接觸到了mantle這個東西,感覺很不錯,在此與各位分享一下。
在開發的過程中,我們常常會從網路獲取資料,而資料通常又為json格式。 這時比較常見的做法是把json資料轉為model物件,這樣我們可以從model物件的屬性讀取資料。 但是常常會面臨如下一些問題:
有沒有辦法可以很優雅的解決這些問題呢,這就是今天要說的mantle框架。
mantle是github的工程師們弄出來的東西,github主頁在此, 引用如下:
居然這麼多檔案! 不要害怕,我們常用到的就是mtljsonadapter
和mtlmodle
而已。mtlmodel
是乙個抽象類,它幫我們做了很多任務作,比如解決前言裡提出的一些問題。 我們要建的model類應該繼承於它,此外你的繼承類一定還要實現mtljsonserializing
協議。mtljsonadapter
則是幫我們把json資料繫結到model的屬性裡,當然,你不用擔心會出現nsnull
的情況,因為轉換後它會自動設定成nil
;
我們新建乙個繼承mtlmodel
的類,叫做testdatamodel
。 我們將從這個位址獲取測試資料。 現在把想要的資料宣告到頭檔案裡
1234567
891011
1213
1415
1617
1819
#import
@inte***ce
testdatamodel : mtlmodel
<
mtljsonserializing
>
@property
(nonatomic
,strong
)nsdate
*date
;@property
(nonatomic
,strong
)nsnumber
*humidity
;@property
(nonatomic
,strong
)nsnumber
*temperature
;@property
(nonatomic
,strong
)nsnumber
*temphigh
;@property
(nonatomic
,strong
)nsnumber
*templow
;@property
(nonatomic
,strong
)nsstring
*locationname
;@property
(nonatomic
,strong
)nsdate
*sunrise
;@property
(nonatomic
,strong
)nsdate
*sunset
;@property
(nonatomic
,strong
)nsstring
*conditiondescription
;@property
(nonatomic
,strong
)nsstring
*condition
;@property
(nonatomic
,strong
)nsnumber
*windbearing
;@property
(nonatomic
,strong
)nsnumber
*windspeed
;@end
在testdatamodel.m
檔案裡,實現mtljsonserializing
協議裡的+ (nsdictionary *)jsonkeypathsbypropertykey
方法。
1234567
891011
1213
1415
1617
1819
2021
2223
2425
2627
#import "testdatamodel.h"
@implementation
testdatamodel+(
nsdictionary*)
jsonkeypathsbypropertykey;}
1234567
891011
1213
1415
1617
1819
-
(bool)(
*)didfinishlaunchingwithoptions:
(nsdictionary*)
launchoptions
}];}
設定斷點到15行,控制台顯示如下圖:
可以看到所有屬性值均已設定好了。 強大吧! 等等…這好像和我們期望的型別不太一樣,我們宣告的date是乙個nsdate型,但這裡卻是nsnumber。json資料裡解析出來的就是nsnumber,那要怎麼轉化為我們期望的nsdate呢? mantle為我們提供了強大的轉換機制。 繼續回到testdatamodel.m
檔案裡。新增如下**:
1234567
89
+(
nsvaluetransformer*)
datejsontransformer
reverseblock:^(
nsdate
*date)];
}
再次執行,控制台結果如下圖:
看見了嗎,date已經成功轉換為nsdate了! 原來,上面的**是要告知mantle,賦值時要先進行轉換,原始json裡是乙個nsnumber,現在轉換為乙個nsdate並返回。 其他屬性需要轉換的都可以這樣做,方法命名規則是屬性jsontransformer
,那麼在對這個屬性進行賦值時就會呼叫這個方法先進行轉換。當json資料裡有nsnull的型別時,我們不用做任何處理,會自動將該屬性置為nil;
那reverseblock是幹什麼的呢? 當要把model轉換回json資料時,如果設定了返回值,那麼會將nsdate轉回nsnumber返回json資料。 我們可以呼叫mtljsonadapter
的
1
+
(nsdictionary*)
jsondictionaryfrommodel:
(mtlmodel
<
mtljsonserializing
>*)
model
;
方法將乙個model例項轉回json資料。
model物件的儲存:
由於mtlmodel已經幫我們實現了nscoding協議, 要把乙個model物件儲存到本地就相當簡單了,只需一行**:
1
[
nskeyedarchiver
archiverootobject:
model
tofile:
path
];
解檔時同樣簡單:
1
testdatamodel
*unachivemodel=[
nskeyedunarchiver
unarchiveobjectwithfile:
path
];
mantle還可以結合coredata使用,這裡不說了。 至此,mantle的簡單使用就介紹完了! 如有什麼不對之處,請各位諒解和指正!
沒有深入研究原始碼,準備抽時間仔細研究一把。 大致看了下,mantle主要使用了一些runtime的東西,獲取到所有propertiy屬性進行繫結。 **看起來有種不明覺厲的感覺,不得不感嘆github上的牛人真多! 想深入研究的同學可以多看下原始碼!
Mantle 初步使用
最近接觸到了mantle這個東西,感覺很不錯,在此與各位分享一下。在開發的過程中,我們常常會從網路獲取資料,而資料通常又為json格式。這時比較常見的做法是把json資料轉為model物件,這樣我們可以從model物件的屬性讀取資料。但是常常會面臨如下一些問題 有沒有辦法可以很優雅的解決這些問題呢,...
Mantle簡單認識及使用
mantle是乙個建模框架,實現了多個不同的nscoding和nscopying方法,還新增了許多非常便利的方法允許你實現更多有用的功能,比如返回乙個json字典,以代表你的物件。很多情況下,mantle可以作為core data的替代選擇。簡單自定義物件繼承mtlmodel並宣告協議,實現 nsd...
Mantle迅速上手
首先,不要害怕,他是幫助我們簡化問題的 比如自動降nsnull轉成nil,減少崩潰的可能 所以並不會難用。我們通常用的就是mtljsonadapter,mtlmodel tip 1 繼承mtlmodel,遵守mtljsonserializing協議 你需要實現這個方法來寫明一下對映關係,這個是我覺得...