雕塑师 0.3.0

Sculptor 0.3.0

测试已测试
语言编程语言 Obj-CObjective C
许可 MIT
发布最新发布2014 年 12 月

David Caunt 维护。



 
依赖关系
AFNetworking~> 2.0
Mantle~> 1.0
 

Sculptor 0.3.0

  • David Caunt

Sculptor 是一个简单但强大的 AFNetworking 序列化器,适用于 Mantle

Sculptor 对 AFHTTPResponseSerializer 的实现使得在不更改现有的 AFNetworking 或 Mantle 代码的情况下创建 Mantle 模型变得容易。您可以与 AFHTTPRequestOperationManagerAFURLSessionManagerAFHTTPRequestOperation 直接交互时使用 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 模型类型的 AFHTTPRequestOperationManagerAFURLSessionManager 实例,SCLMantleResponseSerializer 允许您指定一个匹配器,以便匹配 NSURLResponse 和响应数据到模型类。

模型匹配器实现了 SCLModelMatcher 协议,该协议定义了一个方法

@protocol SCLModelMatcher <NSObject>
@required
- (Class)modelClassForResponse:(NSURLResponse *)response data:(NSData *)data error:(NSError *__autoreleasing *)error;
@end

Sculptor 提供了两个内置匹配器,SCLStaticModelMatcherSCLURLModelMatcher。一个 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 匹配路径

路径匹配是严格的,路径组件的数量必须相等。以下是一个示例匹配器

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

待办事项

  • 请求序列化(待定 AFNetworking 2.1
  • 完整的单元测试覆盖(以及Xcode支持)
  • 文档

当发布时,Sculptor旨在与Mantle 2.0兼容。