第三方库Mantle的简单实用
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的简单实用的更多相关文章
- 第三方库Mantle的源码解析
Mantle是一个用于简化Cocoa或Cocoa Touch程序中model层的第三方库.通常我们的应该中都会定义大量的model来表示各种数据结构,而这些model的初始化和编码解码都需要写大量的代 ...
- python安装第三方库的最简单方式
一.准备工作 (只做一次准备工作,以后都会很方便) 1. 安装pip (1)下载pip到D:\download pip下载地址:https://pypi.python.org/pypi/pip#dow ...
- 第三方库PIL简单使用
PIL为第三方库,需要简单安装,最容易的安装方法 pip install PIL 详细内容见http://effbot.org/imagingbook/ 下面展示一个简单用例:(字母验证码简单实现) ...
- 基于Bootstrap简单实用的tags标签插件
http://www.htmleaf.com/jQuery/ jQuery之家 自由分享jQuery.html5和css3的插件库 基于Bootstrap简单实用的tags标签插件
- FreeSWITCH第三方库(其他)的简单介绍(三)
FreeSWITCH使用了大量的第三方库,本文档主要介绍关联相关库的信息: 音频相关库的信息介绍参考:http://www.cnblogs.com/yoyotl/p/5486753.html 视频相关 ...
- NDK中android.mk文件的简单介绍和第三方库的调用
先贴一个样例,然后解释一下: LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := mydjvuapi SRC_FILE_ ...
- python第三方库requests简单介绍
一.发送请求与传递参数 简单demo: import requests r = requests.get(url='http://www.itwhy.org') # 最基本的GET请求 print(r ...
- python - 实现文本分类[简单使用第三方库完成]
第三方库 pandas sklearn 数据集 来自于达观杯 训练:train.txt 测试:test.txt 概述 TF-IDF 模型提取特征值建立逻辑回归模型 代码 # _*_ coding:ut ...
- Android MultiType第三方库的基本使用和案例+DiffUtil的简单用法
1.MultiType简单介绍 1.1.MultiType用于比较复杂的页面. 如下图,今日头条用到了MultiType处理各种复杂的页面. 这种还是比较简单的类型.因为一个页面也就这种类型. ...
随机推荐
- Slickflow.NET 开源工作流引擎快速入门之二: 简单并行分支流程代码编写示例
前言:对于急切想了解引擎功能的开发人员,在下载版本后,就想尝试编写代码,完成一个流程的开发和测试.本文试图从一个最简单的并行分支流程来示例说明,如何快速了解引擎代码的编写. 版本:.NET Core2 ...
- sed 面试题
#oldboy my qq num is 49000448.$ not 4900000448. my god ,i am not oldbey,but clsn!$ #oldboy my name i ...
- PHP bcpow BC数学函数
定义和用法 bcpow - 任意精度数字的乘方 版本支持 PHP4 PHP5 PHP7 支持 支持 支持 语法 bcpow( string $left_operand , string $right_ ...
- leaflet-webpack 入门开发系列三地图分屏对比(附源码下载)
前言 leaflet-webpack 入门开发系列环境知识点了解: node 安装包下载webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载地址 w ...
- 【React Native】react-native之集成支付宝支付、微信支付
一.在使用支付宝支付.微信支付之前导入桥接好的头文件 github地址:https://github.com/xujianfu/react-native-pay 二.集成支付宝支付流程 RN支付宝需要 ...
- mysql 查询指定数据库中的表明和字段名
SELECT TABLE_NAME,COLUMN_NAME,COLUMN_COMMENT FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_COMMENT LI ...
- busybox启动流程简单解析:从init到shell login
关键词:kernel_init().init.inittab.wait/waitpid.fork/vfork.setsid().execvp/execlp.dup2等等. 由于遇到一系列定制,从ini ...
- 关于Linux下进程的详解【进程查看与管理】
一.关于进程 进程: 已经启动的可执行程序的运行实力 进程的组成:一个进程包含内核中的一部分地址空间和一系列数据结构.其中地址空间是内核标记的一部分内存以供进程使用,而数据结构则用来纪录每个进程的具体 ...
- IntelliJ 注解@Slf4j后找不到log问题解决
解决方案:IntelliJ IDEA安装lombok插件可以解决以上问题 .步骤:1.找到IDEA 上方的菜单栏 点击File =>Settings,或者按快捷键Ctrl+Alt+S. 2.如图 ...
- 201871010109-胡欢欢《面向对象程序设计(java)》第十六周学习总结
项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...