iOS --- Mantle初探

前言

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值