Mantle Introduce

2023-11-29 19:38
文章标签 introduce mantle

本文主要是介绍Mantle Introduce,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Mantle

Mantle是一个iOS模型框架,它为对象和JSON之间的相互转化提供了一种简便的方法。这在处理网络数据的时候非常有用。下面我们将看一下MTLModelMTLJSONAdapter以及为什么你将会考虑在下一个项目中使用Mantle。

MTLModel

MTLModel提供一个简便的方法在NSDictionary对象和自定义对象之间建立映射关系。首先我们来看一个例子。假设从远程服务器上获取了如下JSON数据,然后我们需要将它转化为自定义类型CATProfile的对象。

{"id": 1,"name":"objective Cat","birthday":"2013-09-12 13:29:36 +0100","website":"http://objc.at","location":{"lat":"48.2083","lon":"16.3731"},"relationship_status":"single","awesome":true
}

接下来创建一个MTLModel的子类用来表示上面的JSON对象。

//CATProfile.h
typedef NS_ENUM(NSInteger, CATRelationshipStatus) {CATRelationshipStatusSingle = 0,CATRelationshipStatusRelationship,CATRelationshipStatusComplicated
};@interface CATProfile : MTLModel <MTLJSONSerializing>
@property (strong, nonatomic) NSNumber *profileId;
@property (strong, nonatomic) NSString *name;
@property (strong, nonatomic) NSDate *birthday;
@property (strong, nonatomic) NSURL *websiteURL;
@property (nonatomic) CLLocationCoordinate2D locationCoordinate;
@property (nonatomic) CATRelationshipStatus relationshipStatus;
@property (nonatomic, getter=isAwesome) BOOL awesome;
@end

CATProfile类继承自MTLModel并且实现了MTLJSONSerializing协议。该协议要求实现+JSONKeyPathsByPropertykey方法。

//CATProfile
@implementation CATProfile+ (NSDictionary *)JSONKeyPathsByPropertyKey {//头文件中定义的属性  < : > JSON字典中的keyreturn @{@"profileId":   @"id",@"websiteURL":  @"website",@"locationCoordinate": @"location",@"relationshipStatus": @"relationship_status",};
}@end

+JSONKeyPathsByPropertyKey返回一个NSDictionary用来建立JSON和模型对象属性之间的映射。如果模型属性没有出现在上面的字典里,Mantle自动将它与JSON中同名的值对应起来。

NSValueTransformer

Mantle可以自动处理NSStringNSNumber类型的数据,而对其它数据类型的值则需要我们提供一定的帮助才能正确转换。Mantle利用Foundation框架中的NSValueTransformer在JSON数据和实际模型属性之间建立映射。我们通过实现名为+<propertyName>JSONTransformer的类方法返回所需要的NSValueTransformer对象。

//将birthday映射到NSDate,反之亦然
+ (NSValueTransformer *)birthdayJSONTransformer {return [MTLValueTransformer reversibleTransfomerWithForwardBlock: ^(NSString *dateString) {return [self.dateFormatter dateFromString: dateString];} reverseBlock:^(NSDate *date) {return [self.dateFormatter stringFromDate: date];}];
}+ (NSDateFormatter *)dateFormatter {NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];dateFormatter.locale = [[NSLocale alloc] initWithLocaleIndentifier: @"en_US_POSIX"];dateFormatter.dateFormat = @"yyyy-MM-dd 'T' HH:mm:ss.SSS 'Z'";return dateFormatter;
}

Mantle在运行时调用该方法来决定如何转换birthday属性。下面是其它类型属性的转换器方法。NSURL <->JSON string

+ (NSValueTransformer *)websiteURLJSONTransformer {return [NSValueTransformer valueTransformerForName: MTLURLValueTransformerName];
}

CLLocationCoordinate2D <-> JSON object

+ (NSValueTransformer *)locationCoordinateJSONTransformer {return [MTLValueTranformer reversibleTransformerWithForwardBlock: ^(NSDictionary *coordicateDict){CLLocationDegree latitude = [coordinateDict[@"lat"] doubleValue];CLLocationDegree longitude = [coordinateDict[@"lon"] doubleValue];return [NSValue valueWithMKCoordinate: CLLocationCoordinate2DMake(latitude, longitude)];} reverseBlock:^(NSValue *coordinateValue){CLLocationCoordinate2D coordinate = [coordinateValue MKCoordinateValue];return @{@"lat":@(coordinate.latitude), @"lon":@(coordinate.longitude)};}];
}

enum <-> JSON string

+ (NSValueTransformer *)relationshipStatusJSONTransformer {return [NSValueTransformer mtl_valueMappingTransformerWithDictionary: @{@"single":@(CATRelationshipStatusSingle),@"relationship":@(CATRelationshipStatusInRelationship),@"complicated":@(CATRelationshipStatusComplicated)}];
}

BOOL <-> JSON boolean

+ (NSValueTransformer *)awesomeJSONTransformer {return [NSValueTransformer valueTransformerForName: MTLBooleanValueTransformerName];
}

从JSON创建模型对象

我们已经配置好了模型属性与JSON值的映射关系,可以开始将从API获取到的数据转换为模型对象了。第一步需要用NSJSONSerialization将JSON表示解析为NSDictionary供Mantle使用。然后通过MTLJSONAdapter将字典转换为模型对象。

//创建NSDictionary
NSData *JSONData = ...//接口的响应数据
NSDictionary *JSONDict = [NSJSONSerialization JSONObjectWithData: JSONData options: 0 error: nil];//使用MTLJSONSerialization创建模型对象
CATProfile *profile = [MTLJSONAdapter modelOfClass: CATProfile.class fromJSONDictionary: JSONDict error: NULL];

从模型对象创建JSON

MTLJSONAdapter同样可以用来从模型对象创建字典。

CATProfile *profile = ...
NSDictionary *profileDict = [MTLJSONAdapter JSONDictionaryFromModel: profile];NSData *JSONData = [NSJSONSerialization dataWithJSONObject: profileDict options: 0 error: nil];

注意,如果模型中的属性如果没有对应的JSON值,应该在+JSONKeyPathsByPropertyKey的返回值中指定为NSNull.null,例如@{"name":NSNull.null},这样Mantle会自动忽略它。

映射数组和字典

许多模型相互之间都有关联,它们一般通过JSON数组和对象来表示。

{"id": 1,"name": "Objective Cat",..."owner": {"id":99,"name":"Alexander Schuch"},"friends":[{"name":"Owly","type":"bird"},{"name":"Hedgy","type":"mammal"}]
}

Mantle同样能很好的完成这些对象之间的映射。为了确保正确映射, 我们可以使用NSValueTransformer类别中的两个方法。

+ (NSValueTransformer *)mtl_JSONDictionaryTransformerWithModelClass:(Class)modelClass;
+ (NSValueTransformer *)mtl_JSONArrayTransformerWithModelClass:(Class)modelClass;

当然,同样需要在模型类CATProfile中创建转换方法。

//CATProfile.h
@property (strong, nonatomic) CATOwner *owner;
@property (strong, nonatomic) NSArray *friends;//CATProfile.m
+ (NSValueTransformer *)ownerJSONTransformer {return [NSValueTransfomer mtl_JSONDictionaryTransfomerWithModelClass: CATOwner.class];
}+ (NSValueTransformer *)friendsJSONTransfrmer {return [NSValueTransformer mtl_JSONArrayTransformerWithMocelClass: CATFriend.class];
}

来源:http://www.objc.at/mantle

转载:http://diveinedu.github.io/2014/12/12/Mantle-introduce.html

这篇关于Mantle Introduce的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/434060

相关文章

源码篇:Mantle

Mantle是一个用于简化Cocoa或Cocoa Touch程序中model层的第三方库。通常我们的应该中都会定义大量的model来表示各种数据结构,而这些model的初始化和编码解码都需要写大量的代码。而Mantle的优点在于能够大大地简化这些代码。 Mantle源码中最主要的内容包括: MTLModel类:通常是作为我们的Model的基类,该类提供了一些默认的行为来处理对象的初始化

Linux introduce

Linux各目录内容: /:根目录 bin:二进制文件,放的是可执行文件,比如linux命令 dev:linux中绝大部分设备都是以文件方式存在,dev存放的就是这些设备文件 etc:配置文件 home:linux用户的家 lib:library,存放linux用到的库文件 root:root用户的家 sbin:二进制可执行文件 tmp:临时文件 模式切换: init 3:

OpenXR 超详细的spec--Chapter 1 Introduce

1.什么是OpenXR OpenXR是XR应用的一个API,它是app与runtime进程内或者进程外的接口。Runtime可以处理类似frame composition,外围设备管理、原始tracking information的功能。 Optionally, Runtime可以支持device layer plugins,允许通过共同定义的接口访问各种硬件。 2.OpenXR的应用编程者视

cocoaPods报错 [!] The dependency `Mantle (~ 1.3.1)` is not used in any concrete target.

有时候我们下载别人的demo之后无法运行, 直接执行pods命令会[!] The dependency `Mantle (~> 1.3.1)` is not used in any concrete target. 报类似的错误 需要编辑podfile文件 在创建Podfile的时候,使用下面的格式: platform :iOS, '9.0' use_frameworks!

如何使用 NFTScan NFT API 在 Mantle 网络上开发 Web3 应用

Mantle Network 是建立在以太坊区块链之上的第 2 层扩展解决方案,采用了 Optimistic Rollups 技术,由 BitDAO 孵化,以提供比以太坊更快速和更经济的交易体验。由于 Mantle 基础链构建在 OP Stack 之上并与 EVM 兼容,因此以太坊网络的相关开发人员工具和 API 可以轻松地从原有链迁移,降低相关开发成本。 根据 NFTScan 数据显示,截至

Mantle: A Programmable Metadata Load Balancer for the Ceph File System——论文泛读

SC 2015 Paper 元数据论文阅读汇总 问题 优化Ceph的元数据局部性和负载平衡。 现有方法 提高元数据服务性能的最常见技术是在专用的元数据服务器(MDS)节点之间平衡负载 [16, 25, 26, 21, 28]。常见的方法是鼓励独立增长并减少通信,使用诸如懒惰客户端和MDS同步 [16, 18, 29, 9, 30]、inode路径/权限缓存 [4, 11, 28]、具有局部

Docker Introduce

你的浏览器不支持当前视频格式,视频格式为mp4

【Android】 self_introduce实现

一、测试截图 没有填完的异常处理! 二、关键代码 1、layout <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/linearlayout"android:layout_wi

introduce robust design(DFMEA)

DFMEA 在百度百科中的定义是: 在设计和制造产品时,FMEA是一种可靠性设计的重要方法。它实际上是FMA(故障模式分析)和FEA(故障影响分析)的组合。它对各种可能的风险进行评价、分析,以便在现有技术的基础上消除这些风险或将这些风险减小到可接受的水平。及时性是成功实施FMEA的最重要因素之一,它是一个“事前的行为”,而不是“事后的行为”。为达到最佳效益,FMEA必须在故障模式被纳入产品之前进

分布式数据库DDB introduce

DDB(Distributed database)是网易杭研院立项最早,应用最为广泛的后台产品之一,也是国内最早出现的基于现有database之上开发的分布式数据库中间件,目前依然在为网易易信,云音乐,云阅读等大型互联网产品提供稳定的数据库服务。业界中同类型的产品有阿里集团的TDDL,阿里B2B的cobar等。 DDB主要以两种方式向应用方提供服务: 一种是以JDBC的jar包形式为JAVA应