文档章节

Mantle 第三方库建立model使用

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

没有更多内容

加载失败,请刷新页面

加载更多

kubernetes notes

Error from server (ServerTimeout): error when creating "mysql.yaml": No API token found for service account "default", retry after the token is automatically created and added t......

kut
11分钟前
1
0
代理模式---静态代理

package com.atguigu.java; //接口的应用:代理模式---静态代理。 public class ProxyTest { public static void main(String[] args) { NetWork work = new RealServer(); ProxyServer pro......

architect刘源源
26分钟前
2
1
工作中的一些Git使用

git stash list 查看所有stash git stash apply 0 应用序号为0那个stash并且不删除它 git stash pop 0 应用序号为0那个stash并且删除删除删除它 git stash save "env" stash当前的改动并且取...

-___-
53分钟前
1
0
C# webservice 配置总结

为了方便下次查看,把总结配置文件放这里,看的方便。 <?xml version="1.0" encoding="utf-8"?><!-- 有关如何配置 ASP.NET 应用程序的详细消息,请访问 http://go.microsoft.com/f...

轻轻的往前走
今天
0
0
SpringCloud之Eureka

Eureka简介 什么是Eureka? Eureka是一种基于rest提供服务注册和发现的产品: Eureka-Server: 用于定位服务,以实现中间层服务器的负载平衡和故障转移。 Eureka-client:用于服务间的交互,内...

lc_fly1
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部