1. 测试时, 可以使用下面这个网址及代码来测试, 里面有模型,数组,以及字典, 还可以有long long 转NSDate,  string 转 int等。

NSURL *url = [NSURLURLWithString:@"http://api.openweathermap.org/data/2.5/weather?lat=37.785834&lon=-122.406417&units=imperial"];

[NSURLConnectionsendAsynchronousRequest:[NSURLRequestrequestWithURL:url]

queue:[NSOperationQueuemainQueue]

completionHandler:^(NSURLResponse* response,NSData* data, NSError* connectionError){

if (!connectionError) {

NSDictionary *dict = [NSJSONSerializationJSONObjectWithData:data

options:NSJSONReadingMutableContainers

error:nil];

//将JSON数据和Model的属性进行绑定

FirstInterfaceModel *model = [MTLJSONAdaptermodelOfClass:[FirstInterfaceModelclass]

fromJSONDictionary:dict

error:nil];

NSLog(@"dict=%@\nmodel:%@",dict, model);

NSError *testError =nil;

NSDictionary *dicFromModel = [MTLJSONAdapterJSONDictionaryFromModel:modelerror:&testError];

if (testError ==nil) {

NSLog(@"after convert dic=%@", dicFromModel);

}else {

NSLog(@"after convert dic failed");

}

}

}];

2. 使用时,需要把该模型有哪些属性值写清楚, 转的时候Mantle才知道哪些是需要转的。类型建议使用NSString, NSNumber, NSArray, NSDictionary, 等,不建议使用基本类型。

@interface FirstInterfaceModel :MTLModel <MTLJSONSerializing>

@property (nonatomic,strong) NSDate *date;

@property (nonatomic,strong) NSNumber *humidity;

@property (nonatomic,strong) NSNumber *temperature;

@property (nonatomic,strong) NSString *cod;

@property (nonatomic,strong) NSString *name;

@property (nonatomic,strong) NSString *xxxTestStr;

@property (nonatomic,strong) NSArray *arrWeathers;

@property (nonatomic,strong) sysModel *sys;

@end

3. 实现

+ (NSDictionary *)JSONKeyPathsByPropertyKey {

NSMutableDictionary *mutDic = [[NSDictionarymtl_identityPropertyMapWithModel:[selfclass]] mutableCopy];

[mutDic setObject:@"dt"forKey:@"date"];

[mutDic setObject:@"main.humidity"forKey:@"humidity"];

[mutDic setObject:@"main.temp"forKey:@"temperature"];

[mutDic setObject:@"weather"forKey:@"arrWeathers"];

return mutDic;

}

上面这个方法, 可以把服务器返回的字段与当前的属性名比较,如果相同,则直接使用,如果不相同的, 则与mutDic中的value进行比较, 然后转换成对应key的属性值。

4. 如果上面的服务器返回的cod为整弄,205这样的数据, 但我们这里定义的属性值为NSString, 则就需要下面这样的方式来进行转换,注意下面这个方法是双向转换。

+ (NSValueTransformer *)codJSONTransformer {

return [MTLValueTransformertransformerUsingForwardBlock:^id(id value,BOOL *success, NSError *__autoreleasing *error) {

NSNumber *num = value;

NSString *tempStr = [NSStringstringWithFormat:@"%@", num];

return tempStr;

} reverseBlock:^id(id value,BOOL *success, NSError *__autoreleasing *error) {

NSString *tempStr = value;

NSNumber *tempNum = @(tempStr.integerValue);

return tempNum;

}];

}

再附一个服务器返回的dt为一个long long整型,这里需要一个NSDate.

+ (NSValueTransformer *)dateJSONTransformer {

return [MTLValueTransformertransformerUsingForwardBlock:^id(id value,BOOL *success, NSError *__autoreleasing *error) {

NSNumber *dateNum = (NSNumber *)value;

return [NSDatedateWithTimeIntervalSince1970:dateNum.floatValue];

} reverseBlock:^id(id value,BOOL *success, NSError *__autoreleasing *error) {

NSDate *numDate = (NSDate *)value;

return [NSStringstringWithFormat:@"%f", [numDatetimeIntervalSince1970]];

}];

}

5. 附一个model内嵌model的实现, 注意和上面最初的类型一样,是一个sysModel.class.

+ (NSValueTransformer *)sysJSONTransformer {

return [MTLJSONAdapterdictionaryTransformerWithModelClass:sysModel.class];

// 下面方法与上面这个效果一样。

return [MTLValueTransformertransformerUsingForwardBlock:^id(id value,BOOL *success, NSError *__autoreleasing *error) {

NSDictionary *dic = value;

return [MTLJSONAdaptermodelOfClass:[sysModelclass] fromJSONDictionary:dicerror:nil];

}];

}

然后就会得到一个内嵌的sysModel对象。

6. 再加上一个数组的对象。服务器返回的weather是一个数组, 然后数组中的对象是WeatherModel.

+ (NSValueTransformer *)arrWeathersJSONTransformer {

return [MTLJSONAdapterarrayTransformerWithModelClass:WeatherModel.class];

}

7. 再来一个安全方法。如果我们要求其中的cod不能为空,我们就可以实现下面这个方法,来对当其中有数据为空时,进行一个容错处理。下面这个方法,当服务器有返回数据为null的键值时,而本地又对这个键做了属性匹配时,就会调用下面这个方法,一般情况下可能会崩溃, 所以建议如果有一些重要的不能为null的键,可以在这里进行处理。

- (void)setNilValueForKey:(NSString *)key {

NSLog(@"nil value detect for key=%@", key);

if ([keyisEqualToString:@"cod"]) {

[selfsetValue:@"something"forKey:@"cod"];

}else {

[supersetNilValueForKey:key];

}

}

注意这个方法仅对非指针类型有用,即int float, bool等, 其它类型要想容错[NSNull null], 需要在MTLValueTransformertransformerUsingForwardBlock中进行识别处理。

第三方库Mantle的简单实用的更多相关文章

  1. 第三方库Mantle的源码解析

    Mantle是一个用于简化Cocoa或Cocoa Touch程序中model层的第三方库.通常我们的应该中都会定义大量的model来表示各种数据结构,而这些model的初始化和编码解码都需要写大量的代 ...

  2. python安装第三方库的最简单方式

    一.准备工作 (只做一次准备工作,以后都会很方便) 1. 安装pip (1)下载pip到D:\download pip下载地址:https://pypi.python.org/pypi/pip#dow ...

  3. 第三方库PIL简单使用

    PIL为第三方库,需要简单安装,最容易的安装方法 pip install PIL 详细内容见http://effbot.org/imagingbook/ 下面展示一个简单用例:(字母验证码简单实现) ...

  4. 基于Bootstrap简单实用的tags标签插件

    http://www.htmleaf.com/jQuery/ jQuery之家 自由分享jQuery.html5和css3的插件库 基于Bootstrap简单实用的tags标签插件

  5. FreeSWITCH第三方库(其他)的简单介绍(三)

    FreeSWITCH使用了大量的第三方库,本文档主要介绍关联相关库的信息: 音频相关库的信息介绍参考:http://www.cnblogs.com/yoyotl/p/5486753.html 视频相关 ...

  6. NDK中android.mk文件的简单介绍和第三方库的调用

    先贴一个样例,然后解释一下: LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := mydjvuapi SRC_FILE_ ...

  7. python第三方库requests简单介绍

    一.发送请求与传递参数 简单demo: import requests r = requests.get(url='http://www.itwhy.org') # 最基本的GET请求 print(r ...

  8. python - 实现文本分类[简单使用第三方库完成]

    第三方库 pandas sklearn 数据集 来自于达观杯 训练:train.txt 测试:test.txt 概述 TF-IDF 模型提取特征值建立逻辑回归模型 代码 # _*_ coding:ut ...

  9. Android MultiType第三方库的基本使用和案例+DiffUtil的简单用法

    1.MultiType简单介绍 1.1.MultiType用于比较复杂的页面. 如下图,今日头条用到了MultiType处理各种复杂的页面.    这种还是比较简单的类型.因为一个页面也就这种类型. ...

随机推荐

  1. execjs使用时异常

    一.异常信息(...gbk.....) UnicodeDecodeError: 'gbk' codec can't decode byte 0xa1 in position 26: illegal m ...

  2. Vue.js+vue-element搭建属于自己的后台管理模板:更深入了解Vue.js(三)

    前言 上一章我们介绍了关于Vue实例中一些基本用法,但是组件.自定义指令.Render函数这些放到了本章来介绍,原因是它们要比前面讲的要难一些,组件是Vue.js最核心的功能,学习使用组件也是必不可少 ...

  3. error: (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor'

    这个报错一般是因为你图像的路径写错了,找不到图像而导致的. 解决问题的朋友麻烦点个推荐呗!嘿嘿

  4. Android Studio添加文件注释头模板集合

    Android Studio中设置方式 File -> Settings -> Editor -> File and Code Templates -> 右侧File标签 -& ...

  5. 读书笔记_python网络编程3_(3)

    3.TCP:传输控制协议 第一个版本在1974年定义,建立在网际层协议(IP)提供的数据包传输技术之上.TCP使程序可以使用连续的数据流进行相互通信. 除非网络原因导致连接中断/冻结,TCP都能保证将 ...

  6. HTML5常见的取值与单位

    HTML5常见的取值与单位     长度单位包括 相对长度单位包括:em, ex, ch, rem, vw, vh, vmax, vmin 绝对长度单位包括:cm, mm, q, in, pt, pc ...

  7. 剑指Offer-28.数组中出现次数超过一半的数字(C++/Java)

    题目: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2.如 ...

  8. for循环创建的a标签,当点击时如何确定点击的是哪一个标签?

    创建 代码: js: 效果: 原因: html代码:这种获取选中标签的方式,是通过监听body来实现的,所以body上要增加这个onclick(this)

  9. IDEA的@Override下面有红色波浪线怎么去掉

    测试了 , 不会影响运行 ! 去掉红线 ! file - seting - java compiler - 把两个version都改成1.8  !  (  因为我的jdk是1.8) file - pr ...

  10. OpenFOAM——过渡管中的湍流

    本算例来自<ANSYS Fluid Dynamics Verification Manual>中的VMFL016:Turbulent Flow in a Transition Duct 一 ...