前言
Mantle 是什么?
是一个第三方库,用于简化Cocoa或Cocoa Touch程序中model层的库。通常我们的应该中都会定义大量的model来表示各种数据结构,而这些model的初始化和编码解码都需要写大量的代码。而Mantle的优点在于能够大大地简化这些代码。
Model和JSON数据之间的转换,提高编码效率,使编程人员专注于逻辑上的处理,能够快速的将网络请求的数据,转换成规定的Model.
Mantle常用类
MTLModel类:通常是作为我们的Model的基类,该类提供了一些默认的行为来处理对象的初始化和归档操作,同时可以获取到对象所有属性的键值集合。
MTLJSONAdapter类:用于在MTLModel对象和JSON字典之间进行相互转换,相当于是一个适配器。
MTLJSONSerializing协议:需要与JSON字典进行相互转换的MTLModel的子类都需要实现该协议,以方便MTLJSONApadter对象进行转换。
Mantle 使用
- 定义类继承自MTLModel,定义自己所需要的属性变量,定义在
.h
文件文件中,变量必须为对象,避免使用基础类型如:int, char等。
#import <Mantle/Mantle.h>
typedef enum : NSUInteger {
GHIssueStateOpen,
GHIssueStateClosed
} GHIssueState;
@interface GHIssue : MTLModel <MTLJSONSerializing>
@property (nonatomic, copy, readonly) NSURL *URL;
@property (nonatomic, copy, readonly) NSURL *HTMLURL;
@property (nonatomic, copy, readonly) NSNumber *number;
@property (nonatomic, assign, readonly) GHIssueState state;
@property (nonatomic, copy, readonly) NSString *reporterLogin;
@property (nonatomic, strong, readonly) GHUser *assignee;
@property (nonatomic, copy, readonly) NSDate *updatedAt;
@property (nonatomic, copy) NSString *title;
@property (nonatomic, copy) NSString *body;
@property (nonatomic, copy, readonly) NSDate *retrievedAt;
@end
@end
- 在
.m
中,实现MTLJSONSerializing协议中的+ (NSDictionary *)JSONKeyPathsByProperty
方法
#import "GHIssue.h"
@implementation GHIssue
+ (NSDictionary *)JSONKeyPathsByPropertyKey {
return @{
@"URL": @"url",
@"HTMLURL": @"html_url",
@"number": @"number",
@"state": @"state",
@"reporterLogin": @"user.login",//这个点是什么意思呢,表示将user键对应的子字典里,
//login键对应的值赋给reporterLogin属性。
//我们不用再写 objectForKey]objectForKey]..这种代码了。
//注意了:当user键对应的是数组时,user.login返回的
//为所有temp键对应值的数组合集
@"assignee": @"assignee",
@"updatedAt": @"updated_at"
};
}
- 自定义属性转换
方法名称+ (NSValueTransformer *)属性名JSONTransformer
+ (NSDateFormatter *)dateFormatter {
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
dateFormatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ss'Z'";
return dateFormatter;
}
+ (NSValueTransformer *)updatedAtJSONTransformer {
return [MTLValueTransformer transformerUsingForwardBlock:^id(NSString *dateString, BOOL *success, NSError *__autoreleasing *error) { //将JSON数据转换为对象
return [self.dateFormatter dateFromString:dateString];
} reverseBlock:^id(NSDate *date, BOOL *success, NSError *__autoreleasing *error) {//反变换 将对象转换为JSON数据
return [self.dateFormatter stringFromDate:date];
}];
}
- 实现数据转换
JSON –> Objective
NSError *error = nil;
XYUser *user = [MTLJSONAdapter modelOfClass:XYUser.class fromJSONDictionary:JSONDictionary error:&error];
Objective –> JOSN
NSError *error = nil;
NSDictionary *JSONDictionary = [MTLJSONAdapter JSONDictionaryFromModel:user error:&error];
- 遇到过的错误:
Error Domain=MTLTransformerErrorHandlingErrorDomain Code=1 “Value did not match expected type”
Model中的属性类型要与JOSN请求数据类型保持一致会出现此问题。
更多参考:
http://ourui.github.io/blog/2014/01/22/mantle-use/
http://www.cocoachina.com/ios/20150127/11034.html
http://www.jianshu.com/p/8a1c78fa1bc2