Latest 1.2.1
Homepage https://github.com/gonefish/GQDataController
License MIT
Platforms ios 7.0
Authors

GQDataController是一种专门用于处理网络API和模型对象的控制器,你可以理解为MVVM或者MVC-N构架。

GQDataController使用AFNetworking的AFHTTPSessionManager处理网络请求,并将结果转换成模型对象,内置对MantleJSONModelYYModelMJExtension 模型的支持。

通过GQDataController,你可以创建非常易于使用和高复用的网络API代码。

如何使用

定义子类

@interface BasicDataController : GQDataController

- (NSString *)ip;

@end

@implementation BasicDataController

- (NSArray *)requestURLStrings
{
    return @[@"http://httpbin.org/ip"];
}

- (NSString *)ip
{
    return [self.modelObject objectForKey:@"origin"];
}

@end

请求接口

创建实例

self.basicDataController = [[BasicDataController alloc] initWithDelegate:self]

不带参数的接口请求。

[self.basicDataController request];

带参数的接口请求

[self.basicDataController requestWithParams:@{@"foo" : @"bar"}];

Block风格

[self.basicDataController requestWithParams:nil success:^{

        // ...

    } failure:^(NSError * _Nullable error) {

        // ...

}];

GQDataController

GQDataController是一个抽象类,使用前需要先创建新的子类。每个子类表示一种接口交互。

首先,子类必须实现这个接口,并返回请求的接口字符串。

- (NSArray *)requestURLStrings;

可以设置多个请求地址,方便在接口请求失败时,使用另外的地址继续请求。

HTTP Method

- (NSString *)requestMethod;

默认返回GET。

校验处理

检测返回的结果是否有效,如果返回NO,会进入失败流程,即使接口请求成功。

- (BOOL)isValidWithJSONObject:(id)object;

数据源

GQDataController采用UITableViewDataSource和UICollectionViewDataSource,帮助你创建更轻量的ViewControllers

@property (nonatomic, copy) NSString *cellIdentifier;

@property (nonatomic, copy) GQTableViewCellConfigureBlock tableViewCellConfigureBlock;

@property (nonatomic, copy) GQCollectionViewCellConfigureBlock collectionViewCellConfigureBlock;

分页

GQDataController提供的便捷的分页请求方法:

- (void)requestMore;

这个方法会复制之前的接口请求参数,然后对当前页的参数值进行+1处理。

返回接口分页请求时第几页的参数名称,默认返回值是p。

- (NSString *)pageParameterName;

接口Stub

GQDataController允许你直接使用本地JSON文件来做为接口返回,该功能只在定义过DEBUG宏的条件下开启。

复制

GQDataController也实现NSCopying协议,你可以快速的复制当前的实例。

单例

+ (instancetype)sharedDataController;

这个子类都可以类方法来获取自己的单例。

GQDataControllerDelegate

GQDataControllerDelegate定义了3个方法用于回调,当然你也可以选择Block风格的回调。

- (void)dataControllerWillStartLoading:(GQDataController *)controller;

- (void)dataControllerDidFinishLoading:(GQDataController *)controller;

- (void)dataController:(GQDataController *)controller didFailWithError:(NSError *)error;

GQDynamicDataController

GQDynamicDataController是GQDataController的子类,它允许在不创建子类的情况下,初始化请求的地址和请求的方法,但不能定义其它的东西。通常在接口请求逻辑比较简单的情况下使用。

+ (instancetype)dataControllerWithURLString:(NSString *)URLString;

+ (instancetype)dataControllerWithURLString:(NSString *)URLString requestMethod:(NSString *)method;

GQModelAdapter

GQDataController使用GQModelAdapter来转换AFNetworking返回的JSON对象。你可以根据自己的需求指定不同的适配器,目前支持:Mantle、JSONModel、YYModel、MJExtension。或者通过GQModelAdapter协议创建自己的适配器。

- (Class)modelAdapterClass;

默认使用GQDefaultAdapter,不做任何转换。如果需要使用其它的模型转换,请重写这个方法。

GQDataController会把转换后的值存放到特定的变量中。如果转换的JSON是字典,会将结果赋值到modelObject;如果转换的JSON是数组,则会将结果赋值到modelObjectList。

@property (nonatomic, strong, nullable) id modelObject;

@property (nonatomic, strong, nullable) NSMutableArray *modelObjectList;

modelObject和modelObjectList都有相对应的配置方法,你需要手动指定转换用的Class和JSON路径(可选)。

默认实现中modelObjectListKeyPath和modelObjectListClass会返回modelObjectKeyPath和modelObjectClass的值。

- (Class)modelObjectClass;

- (NSString *)modelObjectKeyPath;

- (Class)modelObjectListClass;

- (NSString *)modelObjectListKeyPath;

系统要求

需要iOS 7以上

第三库依赖:

  • AFNetworking 3.X
  • (可选) Mantle
  • (可选) JSONModel
  • (可选) MJExtension
  • (可选) YYModel or YYKit

安装

CocoaPods

pod 'GQDataController'

#pod 'GQDataController/Mantle'
#pod 'GQDataController/YYModel'
#pod 'GQDataController/YYKit'
#pod 'GQDataController/JSONModel'
#pod 'GQDataController/MJExtension'

例子

请参考Demo工程中的例子:

  1. 基本使用
  2. 使用Block风格的回调
  3. 使用Mantle处理返回结果
  4. DataSource
  5. 分页
  6. 接口的Stub

FAQ

是否支持XML的返回格式?

当前只支持JSON格式。

如何为接口添加公共参数?

自定义AFHTTPRequestSerializer,然后在初始化方法中设置

self.requestOperationManager.requestSerializer

如何自定义接口的响应

自定义AFJSONResponseSerializer,然后在初始化方法中设置

self.requestOperationManager.responseSerializer

你甚至可以自定义子类,用于将任意格式的结果转换成JSON。

是否需要创建自己的基类?

总是继承自己的基类是最好的实践。你可以在基类里配置AFNetworking及其它自定义属性。

LICENSE

See LICENSE

Latest podspec

{
    "name": "GQDataController",
    "version": "1.2.1",
    "summary": "A networking framework for MVVM in iOS",
    "description": "u4e00u6b3eu7b26u5408MVVMu6a21u5f0fu7684u7f51u7edcu6846u67b6uff0cu901au8fc7u6df7u5408AFNetworkingu548cMantleu8ba9u4f60u66f4u65b9u4fbfu7684u5904u7406u7f51u7edcu4ea4u4e92u3002",
    "homepage": "https://github.com/gonefish/GQDataController",
    "platforms": {
        "ios": "7.0"
    },
    "license": "MIT",
    "authors": {
        "Qian GuoQiang": "[email protected]"
    },
    "source": {
        "git": "https://github.com/gonefish/GQDataController.git",
        "tag": "1.2.1"
    },
    "default_subspecs": "Default",
    "subspecs": [
        {
            "name": "Default",
            "libraries": "sqlite3",
            "dependencies": {
                "AFNetworking": [
                    "~> 3.0"
                ]
            },
            "source_files": [
                "GQDataController/*.{h,m}",
                "GQDataController/Adapter/GQDefaultAdapter.{h,m}"
            ]
        },
        {
            "name": "Mantle",
            "dependencies": {
                "Mantle": [],
                "GQDataController/Default": []
            },
            "source_files": "GQDataController/Adapter/GQMantleAdapter.{h,m}"
        },
        {
            "name": "YYModel",
            "dependencies": {
                "YYModel": [],
                "GQDataController/Default": []
            },
            "source_files": "GQDataController/Adapter/GQYYModelAdapter.{h,m}"
        },
        {
            "name": "YYKit",
            "dependencies": {
                "YYKit": [],
                "GQDataController/Default": []
            },
            "source_files": "GQDataController/Adapter/GQYYModelAdapter.{h,m}"
        },
        {
            "name": "JSONModel",
            "dependencies": {
                "JSONModel": [],
                "GQDataController/Default": []
            },
            "source_files": "GQDataController/Adapter/GQJSONModelAdapter.{h,m}"
        },
        {
            "name": "MJExtension",
            "dependencies": {
                "MJExtension": [],
                "GQDataController/Default": []
            },
            "source_files": "GQDataController/Adapter/GQMJExtensionAdapter.{h,m}"
        }
    ]
}

Pin It on Pinterest

Share This