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;
可以设置多个请求地址,便于在接口请求失败时,使用另外的地址继续请求。
HTTP方法
- (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;
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以上
第三方库依赖:
请参考Demo工程中的例子:
是否支持XML返回格式?
当前只支持JSON格式。
如何为接口添加公共参数?
自定义AFHTTPRequestSerializer,然后在初始化方法中设置
self.requestOperationManager.requestSerializer
如何自定义接口的响应
自定义AFJSONResponseSerializer,然后在初始化方法中设置
self.requestOperationManager.responseSerializer
你甚至可以自定义子类,用于将任意格式的结果转换成JSON。
是否需要创建自己的基类?
总是继承自己的基类是最好的做法。你可以在基类中配置AFNetworking及其它自定义属性。
查看LICENSE文件