FDDataClient 1.0.1

FDDataClient 1.0.1

测试已测试
语言语言 Obj-CObjective C
许可证 MIT
已发布最后发布2015 年 5 月

Reid Main 维护。



 
依赖
FDModel~> 2.0
FDRequestClient~> 1.0
 

概览

任何使用过 Objective-C 的 RESTful 服务的人都知道编写解析代码是多么痛苦。FDDataClient 通过利用 FDRequestClient 的网络层和 FDModel 的模型层来减轻这种痛苦。通过结合这两个项目,FDDataClient 允许用户使用 FDModel 实现他们的解析逻辑,并且在 HTTP 请求处理过程中,FDDataClient 提供了三个钩子,用于确定从响应中解析的对象应该对应于 FDModel 的哪个实例。

1. 通过代理方法
FDDataClient 实现了一个代理,它会询问对象应该转换成哪个 FDModel 子类。这个代理会在数据客户端发出的所有请求上被调用。

2. 通过特定于请求的块
当使用数据客户端发送 HTTP 请求时,您可以在代理之前查询 modelClassBlock。如果 modelClassBlock 返回一个类,则不会调用代理。这允许用户覆盖代理并提供针对特定请求的信息。

例如,在一般情况下,如果遇到包含名为 "type" 的键且值为 "bah" 的 NSDictionary,这可能表明您应该创建 FDBah 类的一个实例。然而,对于特定请求,遇到此相同的键值对可能表明您应该创建 FDSubclassedBah 类的实例。

3. 通过 FDModel 子类级别的方法
当解析 FDModel 子类时,您可以通过 modelClassForDictionary:withRemoteKeyPath: 方法指定应该将对象转换成哪个类。

使用这三种方法,可以轻松且高效地实现任何网络服务的数据层,并去除编写自定义解析层所带来的所有样板代码和烦恼。

安装

FDDataClient 支持两种方法。两种方法都假设您的 Xcode 项目正在使用模块。

1. 子项目

  1. 将 "FDDataClient" 项目添加到 "Framework Project" 目录中作为子项目,或将其添加到您的工作区。
  2. 将 "FDDataClient (iOS/Mac)" 添加到目标 "Target Dependencies" 部分。
  3. 在将使用 FDDataClient 的任何文件中使用 "@import FDDataClient"。

示例

NSURL *url = [NSURL URLWithString: @"http://api.feedzilla.com/v1/cultures.json"];

FDHTTPRequest *httpRequest = [FDHTTPRequest requestWithURL: url];

FDDataClient *dataClient = [FDDataClient new];
[dataClient loadHTTPRequest: httpRequest 
    authorizationBlock: nil 
    progressBlock: nil 
    dataParserBlock: nil 
    modelClassBlock: ^Class(NSString *parentKey, id value)
        {
            if (parentKey == nil 
                 && [value isKindOfClass: [NSDictionary class]] == YES)
            {
                return [FDCulture class];
            }

            return nil;
        } 
    completionBlock: ^(FDURLResponse *urlResponse)
        {
            NSLog(@"Finished loading:\n%@", urlResponse.content);
        }];

本例会取任何不是响应根对象的字典,并与FDDataClient通信,告知那些字典应转换为FDCulture的实例。如果在运行上述代码时查看控制台(撰写本文时)

(
    "<FDCulture: 0x7ffefa87c950; ar-all; All (Arabic)>",
    "<FDCulture: 0x7ffefa87dae0; en-all; All (English)>",
    "<FDCulture: 0x7ffefa87dc90; es-ar; Argentina>",
    "<FDCulture: 0x7ffefa87de40; en-au; Australia>",
    "<FDCulture: 0x7ffefa87e1c0; pt-br; Brazil>",
    "<FDCulture: 0x7ffefa87e340; en-ca; Canada>",
    "<FDCulture: 0x7ffefa87e4c0; zh-cn; China>",
    "<FDCulture: 0x7ffefa87e640; en-cn; China (English)>",
    "<FDCulture: 0x7ffefa87e7c0; es-co; Colombia>",
    "<FDCulture: 0x7ffefa87eb40; ar-eg; Egypt (Arabic)>",
    "<FDCulture: 0x7ffefa8127e0; en-eg; Egypt (English)>",
    "<FDCulture: 0x7ffefa87f340; fr-fr; France>",
    "<FDCulture: 0x7ffefa87f4c0; de-de; Germany>",
    "<FDCulture: 0x7ffefa87f640; en-de; Germany (English)>",
    "<FDCulture: 0x7ffefa87f7c0; hi-in; India>",
    "<FDCulture: 0x7ffefa87f940; en-in; India (English)>",
    "<FDCulture: 0x7ffefa87fac0; it-it; Italy>",
    "<FDCulture: 0x7ffefa87fd40; es-mx; Mexico>",
    "<FDCulture: 0x7ffefa87fe00; en-pk; Pakistan>",
    "<FDCulture: 0x7ffefa8801b0; pl-pl; Poland>",
    "<FDCulture: 0x7ffefa880330; ru-ru; Russia>",
    "<FDCulture: 0x7ffefa8804b0; ar-sa; Saudi Arabia (Arabic)>",
    "<FDCulture: 0x7ffefa880630; en-sa; Saudi Arabia (English)>",
    "<FDCulture: 0x7ffefa8809b0; en-za; South Africa>",
    "<FDCulture: 0x7ffefa810ba0; es-es; Spain>",
    "<FDCulture: 0x7ffefa880db0; tr-tr; Turkey>",
    "<FDCulture: 0x7ffefa880f30; en-uk; United Kingdom>",
    "<FDCulture: 0x7ffefa8810b0; en-us; United States>",
    "<FDCulture: 0x7ffefa87fc70; vn-vn; Vietnam>"
)

你会看到每个字典已经被自动解析为FDCulture对象,FDCulture需要实现的唯一的方方法是

+ (NSDictionary *)remoteKeyPathsToLocalKeyPaths
{
    FDCulture *culture = nil;

    NSDictionary *remoteKeyPathsToLocalKeyPaths = @{ 
        @"language_code" : @keypath(culture.languageCode), 
        @"country_code" : @keypath(culture.countryCode), 
        @"culture_code" : @keypath(culture.cultureCode), 
        @"display_culture_name" : @keypath(culture.displayCultureName), 
        @"english_culture_name" : @keypath(culture.englishCultureName) 
        };

    return remoteKeyPathsToLocalKeyPaths;
}

本例展示了如何指定在请求级别应该解析哪些对象。如果你的网络服务已正确设计,那么你不需要知道正在发出什么请求,你可以在气泡中输入所有响应,然后可以在FDDataClient的代理中实现此逻辑。