Mantle可以很方便的去書寫一個模型層的代碼。
使用它可以很方便的去反序列化JSON或者序列化為JSON(需要在
MTLModel
子類中實現(xiàn)
<MTLJSONSerializing>
協(xié)議)
使用一個解釋器
MTLJSONAdapter
去轉(zhuǎn)換模型對象。
NSError *error =
nil;
MyObject *myObject = [
MTLJSONAdapter
modelOfClass:
MyObject.
class
fromJSONDictionary:
JSONDictionary
error:&error];
//把
JSONDictionary轉(zhuǎn)換為模型對象
NSDictionary *
JSONDictionary = [
MTLJSONAdapter
JSONDictionaryFromModel
:myObject];
//將模型對象轉(zhuǎn)為
JSON字典
+JSONKeyPathsByPropertyKey
這個方法返回一個字典,指定著你的模型對象和JSON中關(guān)鍵字的映射關(guān)系。
一個例子:
@interface
XYUser :
MTLModel
@property (
readonly,
nonatomic,
copy)
NSString *name;
@property (
readonly,
nonatomic,
strong)
NSDate *createdAt;
@property (
readonly,
nonatomic,
assign, getter = isMeUser)
BOOL meUser;
@end
@implementation
XYUser + (
NSDictionary *)JSONKeyPathsByPropertyKey {
return @{
@"createdAt":
@"created_at",
//這里代表createdAt屬性映射JSON中的created_at關(guān)鍵字
@"meUser": NSNull
.null
//meUser不會從JSON中反序列化 }; }
@end
當我們用字典反序列化的時候
NSDictionary *
JSONDictionary = @{ @
"name"
: @
"john", @
"created_at"
: @
"2013/07/02 16:40:00 +0000", @
"plan"
: @
"lite" };
XYUser *user = [
MTLJSONAdapter
modelOfClass:
XYUser.
class
fromJSONDictionary:
JSONDictionary
error:&error];
//user中的name為john createdAt為
2013/
07/
02
16
:
40
:
00 +
0000 meUser為
0 plan將會被忽略
+JSONTransformerForKey:
實現(xiàn)這個方法去用一個不一樣的類型轉(zhuǎn)換器去轉(zhuǎn)化屬性
+ (NSValueTransformer *)JSONTransformerForKey:(
NSString *)key {
if ([key isEqualToString:
@"createdAt"]) {
return [NSValueTransformer valueTransformerForName:XYDateValueTransformerName]; }
return
nil; }
對于一些值的轉(zhuǎn)換:
+ (NSValueTransformer *)createdAtJSONTransformer {
return [MTLValueTransformer reversibleTransformerWithForwardBlock:^(
NSString *str) {
return [
self
.dateFormatter dateFromString:str]; } reverseBlock:^(
NSDate *date) {
return [
self
.dateFormatter stringFromDate:date]; }]; }
+classForParsingJSONDictionary:
如果定義了一個類簇,可以實現(xiàn)這個方法去轉(zhuǎn)換。
@interface
XYMessage :
MTLModel
@end
@interface
XYTextMessage:
XYMessage
@property (
readonly,
nonatomic,
copy)
NSString *body;
@end
@interface
XYPictureMessage :
XYMessage
@property (
readonly,
nonatomic,
strong)
NSURL *imageURL;
@end
@implementation
XYMessage + (Class)classForParsingJSONDictionary:(
NSDictionary *)JSONDictionary {
if (JSONDictionary[
@"image_url"] !=
nil) {
return XYPictureMessage
.class; }
if (JSONDictionary[
@"body"] !=
nil) {
return XYTextMessage
.class; } NSAssert(
NO,
@"No matching class for the JSON dictionary '%@'.", JSONDictionary);
return
self; }
@end
使用
NSDictionary *textMessage = @{ @
"id"
:
@1, @
"body"
: @
"Hello World!" };
NSDictionary *pictureMessage = @{ @
"id"
:
@2, @
"image_url"
: @
"http://example.com/lolcat.gif" };
XYTextMessage *messageA = [
MTLJSONAdapter
modelOfClass:
XYMessage.
class
fromJSONDictionary:textMessage
error:
NULL];
XYPictureMessage *messageB = [
MTLJSONAdapter
modelOfClass:
XYMessage.
class
fromJSONDictionary:pictureMessage
error:
NULL];
數(shù)據(jù)的持久化
MTLModel
已經(jīng)遵循了
<NSCoding>
協(xié)議,所以可以
NSKeyedArchiver
歸檔這個模型對象。
更多文章、技術(shù)交流、商務合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
