GQDataController是一种专门用于处理网络API和模型对象的控制器,你可以理解为MVVM或者MVC-N构架。
GQDataController使用AFNetworking的AFHTTPSessionManager处理网络请求,并将结果转换成模型对象,内置对Mantle,JSONModel,YYModel,MJExtension 模型的支持。
通过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是一个抽象类,使用前需要先创建新的子类。每个子类表示一种接口交互。
首先,子类必须实现这个接口,并返回请求的接口字符串。
- (NSArray *)requestURLStrings;
可以设置多个请求地址,方便在接口请求失败时,使用另外的地址继续请求。
GQDataController除了支持从网络请求数据外,还支持从本地的SQLite加载数据。需要返回特定的URL格式,类似于:gqsqlite:///sqlite/path?gqsql=SELECT * FROM tablename
你可以通过下面的分类方便的创建SQLite URL
+ (instancetype)sqliteURLStringWithDatabaseName:(NSString *)databaseName sql:(NSString *)sql;
通过SQLite获取的数据总是以JSON列表返回,每一行数据库记录会转换成字典格式,列的名称做为键值。
- (NSString *)requestMethod;
默认返回GET。当前支持:GET, POST, PUT, PATCH, DELETE。
检测返回的结果是否有效,如果返回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;
GQDataController允许你直接使用本地JSON文件来做为接口返回,该功能只在定义过DEBUG宏的条件下开启。
GQDataController也实现NSCopying协议,你可以快速的复制当前的实例。
+ (instancetype)sharedDataController;
这个子类都可以类方法来获取自己的单例。
GQDataControllerDelegate定义了3个方法用于回调,当然你也可以选择Block风格的回调。
- (void)dataControllerWillStartLoading:(GQDataController *)controller;
- (void)dataControllerDidFinishLoading:(GQDataController *)controller;
- (void)dataController:(GQDataController *)controller didFailWithError:(NSError *)error;
GQDynamicDataController是GQDataController的子类,它允许在不创建子类的情况下,初始化请求的地址和请求的方法,但不能定义其它的东西。通常在接口请求逻辑比较简单的情况下使用。
+ (instancetype)dataControllerWithURLString:(NSString *)URLString;
+ (instancetype)dataControllerWithURLString:(NSString *)URLString requestMethod:(NSString *)method;
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
pod 'GQDataController'
#pod 'GQDataController/Mantle'
#pod 'GQDataController/YYModel'
#pod 'GQDataController/YYKit'
#pod 'GQDataController/JSONModel'
#pod 'GQDataController/MJExtension'
请参考Demo工程中的例子:
- 基本使用
- 使用Block风格的回调
- 使用Mantle处理返回结果
- DataSource
- 分页
- 接口的Stub
- SQLite
是否支持XML的返回格式?
当前只支持JSON格式。
如何为接口添加公共参数?
自定义AFHTTPRequestSerializer,然后在初始化方法中设置
self.requestOperationManager.requestSerializer
如何自定义接口的响应
自定义AFJSONResponseSerializer,然后在初始化方法中设置
self.requestOperationManager.responseSerializer
你甚至可以自定义子类,用于将任意格式的结果转换成JSON。
是否需要创建自己的基类?
总是继承自己的基类是最好的实践。你可以在基类里配置AFNetworking及其它自定义属性。
See LICENSE