Mantle 快速使用上手

更新备注:现在我在项目里都用 YYModel 了,Mantle 不怎么用了。供参考。


本来觉得前面应该简单说一下它能够简化的东西,后来想想,能搜到这里的肯定知道它是什么。还是简单写一下:
官方解释:

Mantle makes it easy to write a simple model layer for your Cocoa or Cocoa Touch application.

Mantle 帮助我们简化了 Cocoa & Cocoa Touch 的 Model 层。

一般来说我们的做 Model 层的开发经常要完成如下工序:

  • 做 Model 层的东西动不动就定义一堆 Property ( 其实使用Mantle也得定义...嗯...我也不知道我为什么写这条)
  • 「重点」从服务器获得 JSON 串之后要手写一个 ParseToMyModel 这么一个方法,这个方法接受一个 Dict,返回一个 MyModel *myModel,十分难写。
  • Submit 本地的 Model 的时候,自己得拼一个 JSON 吧......
  • 要归档...嗯...- (void)encodeWithCoder:(NSCoder *)coder;
  • 归档了之后,还要...嗯...- (id)initWithCoder:(NSCoder *)coder;

我司小项目有10个自定义的 Model ...一个一个地写这么多,多 low 啊 ...想想人家 俄罗斯的工程师大神 !这种东西写到第二遍的时候是不是就应该去封装优化啦?

Mantle的出现其实就解决了上面的问题。

马上零点了,好困,赶紧写完睡觉了。。。

快速集成

Step 1:pod 引入

一定要用 CocoaPods,别手动拖进去,好麻烦的说。

pod 'Mantle', '~> 2.0.4'

Step 2:创建适用于 Mantle 的 Model

哦,我司后台妹子下午刚刚给我了个这个 JSON:

{
    "create_time":"2015-11-26 16:38:03.0",
    "create_user":"81",
    "order_id":"1448527083280",
    "order_status":"0",
    "pay_status":"1",
    "payment":"0.50",
    "remerk":"",
    "storeAddress":"",
    "userOrderId":"201511264820"
}

然后是不是要根据这个创建 Model 呀。

New File -> Cocoa Class -> PSOrder(YourModelName)
这里的 SubClass 填上 MTLModel

哦,这篇用的语言是 OC,好久没写 OC 啦~

创建完了时候在 .h 文件中 #import

#import "MTLModel.h"

然后还要遵守一个Procotol <MTLJSONSerializing>

@interface PSOrder : MTLModel <MTLJSONSerializing>

然后就是要把所有的属性写出来,我使用的是 Xcode 插件 ESJsonFormat

直接生成一堆 @property,但是 strong assign weak copy readonly 修饰符什么的还是自己要对一下,根据你 Model 的需求来。

然后把 iVar 们的命名觉得有必要的稍微改改,你看看这个 order_id 符合 iOS 变量命名规范吗。

@property (nonatomic, copy, readonly) NSString *remerk;
@property (nonatomic, copy, readonly) NSString *orderID;
@property (nonatomic, copy, readonly) NSString *createUser;
@property (nonatomic, copy, readonly) NSString *orderStatus;
@property (nonatomic, copy, readonly) NSString *payment;
@property (nonatomic, copy, readonly) NSString *storeAddress;
@property (nonatomic, copy, readonly) NSString *userOrderId;
@property (nonatomic, copy, readonly) NSString *createDate;
@property (nonatomic, copy, readonly) NSString *payStatus;

先这样,然后之前遵守的Procotol <MTLJSONSerializing> 就要登场啦,

+ (NSDictionary *)JSONKeyPathsByPropertyKey {
  return @{
           @"payStatus": @"pay_status",
           @"orderID": @"order_id",
           @"createUser": @"create_user",
           @"orderStatus": @"order_status",
           @"payment": @"payment",
           @"storeAddress": @"storeAddress",
           @"userOrderId": @"userOrderId",
           @"createDate": @"create_time",
           @"payStatus": @"pay_status",
           @"remark": @"remerk"};
}

凭你深厚的 iOS 开发程序员的慧眼你应该能看出来这个是干嘛的,这个方法提供了一个 Dict 作为 Mantle 的 Map 映射。

有了这个 Dict 之后呢,Mantle 就知道 JSON 里面的某个键值对对应的是 Model 里面的哪个 property 了。

其实还有另外一个好处,你想,如果你的项目写到了足够后期,即使这个时候 Server 端要把返回的一个 remark 改成 remark,你只需要修改映射表一个地方就 OK 辣,别的地方都不需要修改。

嗯。

Step 3:Mantle Model 的生成

你的 Request 模块拿到了 JSON 字符串之后呢......算了直接给你看代码:

for (NSDictionary* orderDict in dic[@"data"]) {
  NSError* error;
  PSOrder* order = [MTLJSONAdapter modelOfClass:[PSOrder class] fromJSONDictionary:orderDict error:&error];
  if(error){
    NSLog(@"error:%@, Info:%@",error,error.userInfo);
  }
  [searchResults addObject:order];
}

核心代码:

 PSOrder* order = [MTLJSONAdapter modelOfClass:[PSOrder class] fromJSONDictionary:orderDict error:&error];

如果没问题的话,这里的 order 对象就已经成功转换成功了。

对了可以把生成好的 model 对象 NSLog 出来,发现成功转化成 JSON 字符串了,很方便了对象的上传操作。

这就是 Mantle 的简单用法快速上手。后期更加高级的用法在做补充,整个Mantle很值得研究,而且有很多工具类,值得满满深入研究。


简单提一下实现原理

Mantle 的实现原理其实特别简单,你想,它唯一还没有被优化的是 @Property 还得手写,当然这个可能后期也不太好优化,因为 iVar 的修饰符涉及项目的业务需求,所以是多变的。

从这点入手,Mantle 拿到了JSON,是不是知道所有的 Key 列表,假设你 Model 的所有 property 都没写错的话,所有的映射都做好了。Mantle 可以使用 Runtime 和 KVC 去把 JSON 串里面值一个一个地塞进到你的 MTLModel 里面。

所以实现的原理最核心最重要的就是两个:

  • Runtime 的 propertyList
  • KVC
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,016评论 4 62
  • github排名https://github.com/trending,github搜索:https://gith...
    小米君的demo阅读 4,535评论 2 38
  • 漫天漫地雾弥身, 秋风秋雨愁杀人。 恍然一过夔门间, 人生自是不与蕴。
    支武昂阅读 165评论 0 0
  • 听,那断断续续的雨声 看,那片叶尖上的雨水 闻,那花儿雨后的芬芳 ...
    浩宇小丸子阅读 251评论 15 12
  • 对于我来说,这本书…… 如果一切都离开了,失重了,那么便是最重,要好好珍惜这一切。 历史可以...
    桦子语阅读 433评论 0 1