文档章节

Mantle 第三方库建立model使用

JK_Jack
 JK_Jack
发布于 2015/10/19 17:18
字数 485
阅读 27
收藏 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

没有更多内容

加载失败,请刷新页面

加载更多

sqlserver 2008 r2 直接下载地址(百度云)

之前下载的sqlserver2008发现不能附加,就卸载了,重新找到了sqlserver2008R2的百度云资源 卸载sqlserver2008还是有点麻烦,不过就是需要删除注册表中的信息 自己来回卸载了3次终于重装sqlse...

dillonxiao
33分钟前
1
0
[Java]JVM调优总结 -Xms -Xmx -Xmn -Xss

JVM调优总结 -Xms -Xmx -Xmn -Xss 博客分类: Java General JVM应用服务器电信CMS算法 堆大小设置 JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制;系统的可...

morpheusWB
44分钟前
1
0
C++ std::function 和 std::bind

C++11提供了std::function和std::bind两个工具,用于引用可调用对象。这些可调用对象包括 普通函数,Lambda表达式,类的静态成员函数,非静态成员函数以及仿函数等。引用可调用对象,可以用于...

yepanl
今天
2
0
python:可迭代对象的索引

关于 python的range的用法: 注意是[ 开始,结束)的半开区间,不包括结束 http://www.runoob.com/python/python-func-range.html import collectionsfrom collections import Iterable字符串......

Oh_really
今天
3
0
docker-compose ,docker-stack

1.例子 version: "3"services: php: image: registry.cn-hangzhou.aliyuncs.com/lxepoo/apache-php5 ports: - "38080:80" networks: - my_php_mysql volum......

chenbaojun
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部