Mantle 初步使用

2021-07-16 21:34:32 字數 4460 閱讀 1659

最近接觸到了mantle這個東西,感覺很不錯,在此與各位分享一下。

在開發的過程中,我們常常會從網路獲取資料,而資料通常又為json格式。 這時比較常見的做法是把json資料轉為model物件,這樣我們可以從model物件的屬性讀取資料。 但是常常會面臨如下一些問題:

有沒有辦法可以很優雅的解決這些問題呢,這就是今天要說的mantle框架。

mantle是github的工程師們弄出來的東西,github主頁在此, 引用如下:

居然這麼多檔案! 不要害怕,我們常用到的就是mtljsonadaptermtlmodle而已。mtlmodel是乙個抽象類,它幫我們做了很多任務作,比如解決前言裡提出的一些問題。 我們要建的model類應該繼承於它,此外你的繼承類一定還要實現mtljsonserializing協議。mtljsonadapter則是幫我們把json資料繫結到model的屬性裡,當然,你不用擔心會出現nsnull的情況,因為轉換後它會自動設定成nil;

我們新建乙個繼承mtlmodel的類,叫做testdatamodel。 我們將從這個位址獲取測試資料。 現在把想要的資料宣告到頭檔案裡

123

4567

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方法。

123

4567

891011

1213

1415

1617

1819

2021

2223

2425

2627

#import "testdatamodel.h"

@implementation

testdatamodel+(

nsdictionary*)

jsonkeypathsbypropertykey;}

123

4567

891011

1213

1415

1617

1819

-

(bool)(

*)didfinishlaunchingwithoptions:

(nsdictionary*)

launchoptions

}];}

設定斷點到15行,控制台顯示如下圖:

可以看到所有屬性值均已設定好了。 強大吧! 等等…這好像和我們期望的型別不太一樣,我們宣告的date是乙個nsdate型,但這裡卻是nsnumber。json資料裡解析出來的就是nsnumber,那要怎麼轉化為我們期望的nsdate呢? mantle為我們提供了強大的轉換機制。 繼續回到testdatamodel.m檔案裡。新增如下**:

123

4567

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協議 你需要實現這個方法來寫明一下對映關係,這個是我覺得...