测试已测试 | ✓ |
语言编程语言 | Obj-CObjective C |
许可 | MIT |
发布最新发布 | 2014 年 12 月 |
由 David Caunt 维护。
依赖关系 | |
AFNetworking | ~> 2.0 |
Mantle | ~> 1.0 |
Sculptor 是一个简单但强大的 AFNetworking 序列化器,适用于 Mantle。
Sculptor 对 AFHTTPResponseSerializer
的实现使得在不更改现有的 AFNetworking 或 Mantle 代码的情况下创建 Mantle 模型变得容易。您可以与 AFHTTPRequestOperationManager
、AFURLSessionManager
或 AFHTTPRequestOperation
直接交互时使用 Sculptor 的序列化器。
Sculptor 是预 1.0 软件,但 API 已经非常明确。支持 iOS 和 Mac。
通过 CocoaPods 安装
pod 'Sculptor', '~> 0.2'
或者克隆此仓库并将 Sculptor 项目的文件拖放到您的项目文件或工作区中。
将响应数据序列化为单个模型类型非常简单。
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.responseSerializer = [SCLMantleResponseSerializer serializerForModelClass:GHUser.class];
[manager GET:@"https://api.github.com/users/dcaunt" parameters:nil success:^(AFHTTPRequestOperation *operation, GHUser *user) {
// GHUser is an MTLModel subclass
NSLog(@"User model is %@", user);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error fetching user: %@", error);
}];
对于需要将响应序列化到不同 Mantle 模型类型的 AFHTTPRequestOperationManager
和 AFURLSessionManager
实例,SCLMantleResponseSerializer
允许您指定一个匹配器,以便匹配 NSURLResponse
和响应数据到模型类。
模型匹配器实现了 SCLModelMatcher
协议,该协议定义了一个方法
@protocol SCLModelMatcher <NSObject>
@required
- (Class)modelClassForResponse:(NSURLResponse *)response data:(NSData *)data error:(NSError *__autoreleasing *)error;
@end
Sculptor 提供了两个内置匹配器,SCLStaticModelMatcher
和 SCLURLModelMatcher
。一个 SCLStaticModelMatcher
实际上在上述简单序列化示例中配置,当使用 +[SCLMantleResponseSerializer serializerForModelClass:]
时。此匹配器总是返回相同的 Mantle 模型类,而不管响应如何。
SCLURLModelMatcher
是基于 URL 的匹配器,受 Android 的 UriMatcher
的影响很大。为了使用它,您指定路径如何映射到 MTLModel
类。
继续我们的 GitHub API 例子
SCLURLModelMatcher *matcher = [SCLURLModelMatcher matcher];
[matcher addPath:@"/users/*" forClass:GHUser.class];
[matcher addPath:@"/orgs/*" forClass:GHOrganization.class];
[matcher addPath:@"/repos/*/*/issues/#" forClass:GHIssue.class];
通配符 *
匹配任何文本,通配符 #
只匹配数字。
使用 AFNetworking 进行请求
NSURL *baseURL = [NSURL URLWithString:@"https://api.github.com/"];
self.manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:baseURL];
self.manager.responseSerializer = [SCLMantleResponseSerializer serializerWithModelMatcher:matcher readingOptions:0];
[self.manager GET:@"/users/dcaunt" parameters:nil success:^(AFHTTPRequestOperation *operation, GHUser *user) {
NSLog(@"User model is %@", user);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error fetching user: %@", error);
}];
路径匹配是严格的,路径组件的数量必须相等。以下是一个示例匹配器
SCLURLModelMatcher *matcher = [SCLURLModelMatcher matcher];
[matcher addPath:@"/users/*" forClass:GHUser.class];
此匹配器将返回模型类 GHUser
用于 URL /users/dcaunt
和 /users/github
,但对于 /users/dcaunt/repos
则不会发生匹配。
为了匹配此 URL,请向匹配器添加另一个路径
[matcher addPath:@"/users/*/repos" forClass:GHRepository.class];
如果您的baseURL包含路径前缀,例如 https://api.example.com/v3/
,您可以告诉匹配器忽略这个前缀。
SCLURLModelMatcher *matcher = [SCLURLModelMatcher matcherWithPathPrefix:@"v3"];
最后,匹配器使用AFNetworking提供的NSURLResponse中的NSURL。如果您的网络服务提供重定向,请确保将这些路径添加到匹配器中。
SCLModelMatcher
的实现接收到完整的响应对象以及相关的NSURLResponse,当询问要返回的Mantle模型类时。例如,Stack Exchange API在每个JSON响应包装器中返回一个type
字段。您可以使用此字段来选择用于序列化的Mantle模型子类。
在运行测试之前,请务必运行引导脚本初始化项目。
script/bootstrap
使用xctool运行测试。您需要xctool版本0.1.14或更高版本。
xctool -project Sculptor.xcodeproj -scheme 'Sculptor iOS' -sdk iphonesimulator -configuration Release test -test-sdk iphonesimulator
xctool -project Sculptor.xcodeproj -scheme 'Sculptor Mac' -sdk macosx -configuration Release test -test-sdk macosx
当发布时,Sculptor旨在与Mantle 2.0兼容。