文档章节

Mantle 第三方库建立model使用

JK_Jack
 JK_Jack
发布于 2015/10/19 17:18
字数 485
阅读 26
收藏 0
点赞 0
评论 0

Mantle使用

Mantle可以很方便的去书写一个模型层的代码。

使用它可以很方便的去反序列化JSON或者序列化为JSON(需要在MTLModel子类中实现<MTLJSONSerializing>协议)

使用一个解释器MTLJSONAdapter去转换模型对象。

NSError *error = nil;
MyObject *myObject = [MTLJSONAdapter modelOfClass:MyObject.class fromJSONDictionary:JSONDictionary error:&error]; //把JSONDictionary转换为模型对象

NSDictionary *JSONDictionary = [MTLJSONAdapter JSONDictionaryFromModel:myObject]; //将模型对象转为JSON字典

+JSONKeyPathsByPropertyKey

这个方法返回一个字典,指定着你的模型对象和JSON中关键字的映射关系。

一个例子:

@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关键字
 @"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:

实现这个方法去用一个不一样的类型转换器去转化属性

+ (NSValueTransformer *)JSONTransformerForKey:(NSString *)key {
 if ([key isEqualToString:@"createdAt"]) {
 return [NSValueTransformer valueTransformerForName:XYDateValueTransformerName];
}
 return nil;
}

对于一些值的转换:

+ (NSValueTransformer *)createdAtJSONTransformer {
 return [MTLValueTransformer reversibleTransformerWithForwardBlock:^(NSString *str) {
 return [self.dateFormatter dateFromString:str];
 } reverseBlock:^(NSDate *date) {
 return [self.dateFormatter stringFromDate:date];
}];
}

+classForParsingJSONDictionary:

如果定义了一个类簇,可以实现这个方法去转换。

@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];

数据的持久化


MTLModel已经遵循了<NSCoding>协议,所以可以NSKeyedArchiver归档这个模型对象。

本文转载自:

共有 人打赏支持
JK_Jack
粉丝 0
博文 6
码字总数 2658
作品 0
广州
《iOS进阶指南》试读之《Mantle解析》

Mantle 阅读一个库的源码,首先要知道,我们为什么需要这一类的库。 Mantle的目的 Mantle 的诞生是为了更方便的将服务端返回的数据映射为我们的 Model。 简单来说,我们在写 app 的时候,经常...

叶孤城___
2016/06/18
0
0
学习笔记整理

写iOS 程序的时候往往需要很多第三方框架的支持,可以大大减少工作量,讲重点放在软件本身的逻辑实现上。 GitHub 里面有大量优秀的第三方框架,而且 License 对商业很友好。一下摘录一下几乎...

我是IT码农
2016/03/29
8
0
iOS JSON 模型转换库评测

iOS 开发中总会用到各种 JSON 模型转换库,这篇文章将会对常见的几个开源库进行一下评测。评测的内容主要集中在性能、功能、容错性这几个方面。 评测的对象: Manually 手动进行 JSON/Model...

hejunbinlan
2016/01/13
47
0
常用的第三方

1.AFNetworking   目前比较推荐的iOS网络请求组件,默认网络请求是异步,通过block回调的方式对返回数据进行处理。 2.FMDB   对sqlite数据库操作进行了封装,demo也比较简单。 3.MBProg...

凉亭-月下殇
2016/11/04
14
0
工作中有可能用到的开源库和第三方组件

 项目名称 项目信息 AFNetworking 网络请求组件 FMDB 本地数据库组件 SDWebImage 多个缩略图缓存组件 UICKeyChainStore 存放用户账号密码组件 Reachability 监测网络状态 DateTools 友好化...

在脚下的路
2016/01/15
162
0
iOS开发中使用Mantle构建模型层

iOS开发中使用Mantle构建模型层 曾静的技术博客2017-12-100 阅读 iOS 在iOS的开发中为了快速的实现产品的迭代和新功能的开发,常常会弱化Model的功能,NSDictionary作为承载业务的数据类型出...

曾静的技术博客
2017/12/10
0
0
现流行的第三方库及名称

CocoaPods 是不是已经厌烦了将各种库拖拽到Xcode项目中?那么,CocoaPods的出现就帮你解决了这一问题。CocoaPods是Objective-C项目中最有名的类库管理工具,可以解决库与库之间的依赖关系,下...

Matsonga
2016/02/20
424
0
关于目前自己iOS项目使用的第三方开源库

1.AFNetworking   目前比较推荐的iOS网络请求组件,默认网络请求是异步,通过block回调的方式对返回数据进行处理。 2.FMDB   对sqlite数据库操作进行了封装,demo也比较简单。 3.MBProg...

-Man
2015/12/01
44
0
Mantle--国外程序员最常用的iOS模型&字典转换框架

Mantle简介 Mantle是iOS和Mac平台下基于Objective-C编写的一个简单高效的模型层框架。 Mantle能做什么 Mantle可以轻松把JSON数据、字典(Dictionary)和模型(即Objective对象)之间的相互转...

ios122
2015/10/20
104
0
YYModel的介绍与使用

最近有时间就来看看之前一直想了解的YYModel,下面开始直奔主题。 介绍 iOS / OSX高性能模型框架。(YYmodel是来自组件YYKit) 性能 时间成本(过程GithubUser 10000次iPhone 6): 1-0.png Manu...

宵衣旰食
2016/11/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

多线程Thread-多线程顺序执行

需求:现在有两个任务,任务1和任务2,任务1中有多个线程,并且任务2必须等任务1完成后才能执行。 namespace TThread{ class Program { static void Main(string[] ar...

kaixinguo314
5分钟前
0
0
直播总结

https://blog.csdn.net/weiyuefei/article/details/70257616 视频: 上传服务,转码服务,视频一致性MD5 视频转码技术及转码实现详解 https://wenku.baidu.com/view/32702108844769eae009eda...

素雷
7分钟前
0
0
Linux系统-tcpdump常用抓包命令

序言 单独总结tcpdump抓包的常用命令 主要语法 过滤主机/IP: tcpdump -i eth1 host 172.16.7.206 抓取所有经过网卡1,目的IP为172.16.7.206的网络数据 过滤端口: tcpdump -i eth1 dst port...

MrBoyce
8分钟前
0
0
Nginx参数

#运行用户 user nobody; #启动进程,通常设置成和cpu的数量相等 worker_processes 1; #全局错误日志及PID文件 #error_log logs/error.log; #error_log logs/error.log notice; #error_log lo......

courtzjl
10分钟前
0
0
274. H-Index - LeetCode

Question 274. H-Index Solution 题目大意: 论文里的 h 因子判定,题目的意思可能有点晦涩。h 因子是评判学术成就的一种重要方法,h 因子越高越好,h 因子兼顾研究学术人员的学术产出数量与...

yysue
12分钟前
0
0
 Unable to read class [com.mrp.action.BaseAction]

struts2启动时,出现的 Unable to read class [com.mrp.action.BaseAction] java.lang.NoClassDefFoundError: com/opensymphony/xwork2/util/finder/DefaultClassFinder$InfoBuildingVisito......

uug
14分钟前
0
0
分发系统介绍&expect脚本远程登录&expect脚本远程执行命令&expect脚本传递参数

20.27 分发系统介绍 应用场景 企业中随之业务的逐渐增大,后端所使用的编程语言是php,系统为LAMP/LNMP架构,需要将代码上传到服务器中;代码会不断的迭代,这就需要在业务服务器上更新代码,...

影夜Linux
15分钟前
0
0
form 提交多个对象及springMVC接收

var priceSignList = new Array(); $("#appExponentPriceSignEditForm tr").each(function() { var that = this; var orderItemObj = new Object(); $(that).find("select,input").each(func......

fyliujj
17分钟前
0
0
Spring boot中关于多对多查询json无限递归问题

控制台异常 #...java.lang.Illegal State Exception: Cannot call sendError() after the response has been committed#... 父类 BusinessTemplate.java // ...@OneToMany(targetEnti......

亚林瓜子
19分钟前
0
0
oracle 排序 row_number() over(partition by 排序字段)

业务描述:按t.truckId,t.riskCode 分组,每个分组里有分数,取分组中分数最大的那条记录。 如:A1 B1 5 6 A1 B1 5 3 A1 B2 2 5 A1 B2 2 1 已经按 A,B分组了 但是 我需要第一条和第三条数据,...

轻量级赤影
19分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部