| 测试已测试 | ✓ |
| 语言编程语言 | 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;
@endSculptor 提供了两个内置匹配器,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兼容。