GQMapping 1.2.4

GQMapping 1.2.4

测试已测试
Lang语言 Obj-CObjective C
许可证 MIT
发布最新发布2016年8月

BossyGao维护。



GQMapping 1.2.4

  • 作者:
  • developer_高

     

GQNetWork

继承形式的多重网络请求框架,简单易用,自带关系映射(Mapping),支持流量统计,支持https请求,请求数据缓存机制,支持链式调用,支持model版本控制,支持block,delegate返回请求数据。

简单使用

基本使用

1. 将GQNetWork文件夹添加到工程中。(详见demo)

2. 添加一个继承自GQDataRequest的类,在.m文件中覆盖以下基本方法,就可以在需要使用的页面中发起请求

  //请求的url
  - (NSString*)getRequestUrl;

  //host
  - (NSString *)getBaseUrl;

  //请求方法
  - (GQRequestMethod)getRequestMethod;

3. 在需要发起请求的页面引入继承类,添加使用block的请求方法(如需要使用delegate或其他方法,详见GQBaseDataRequest头文件)

[DemoHttpRequest requestWithOnRequestFinished:^(GQBaseDataRequest *request, GQMappingResult *result) {
        NSLog(@"%@",result.rawDictionary);
    } onRequestFailed:^(GQBaseDataRequest *request, NSError *error) {
        NSLog(@"%@",error);
    }];

高级使用

前面配置与Simple Use相同,还有更多高级用法

关系映射 示例🌰

(1)如果后台传给我的数据是这样的

{
    message = "执行成功";
    result =     {
        rows =         (
                        {
                course = 0;
                createTime = 1451355631000;
                description = "三文鱼";
                enumId = 4;
                id = 39;
                likes = 19;
                name = "法香三文鱼";
                picUrl = "/nisefile/files/image/2015-12-29/5681edef0cf2a9072bd6be4a.jpg";
                price = 99;
            }
        );
        total = 1;
    };
    success = 1;
}

(2)如果我要取rows里面内容的话使用map是一件很简单的事情,配置ProductModel,如果你的model属性名和后台返回的字段是一样的,那么就不需要配置

//像这里的话因为后台返回的字段有id  description 字段, 所以我们定义属性名时就修改了一下,所以需要自己写一下映射关系。
+ (NSDictionary *)attributeMapDictionary{
    return @{@"course":@"course",
             @"createTime":@"createTime",
             @"pDescription":@"description",
             @"enumId":@"enumId",
             @"pId":@"id",
             @"likes":@"likes",
             @"name":@"name",
             @"picUrl":@"picUrl",
             @"price":@"price"};
}

(3) 在发起请求之前配置ProductModel的map

GQObjectMapping *map = [[GQObjectMapping alloc]initWithClass:[ProductModel class]];

[map addPropertyMappingsFromDictionary:[ProductModel attributeMapDictionary]];

(4)将配置好的map传到请求体中再发起请求,不对这样返回的数组为(null)

    GQRequestParameter *parameter = [[GQRequestParameter alloc] init];

    parameter.mapping = map;

    [DemoHttpRequest requestWithRequestParameter:parameter
                                      onRequestStart:nil
                                   onRequestFinished:^(GQBaseDataRequest *request, GQMappingResult *result)
        {
                                       NSLog(@"%@",result.array);//打印出来的就是映射后的数组
        }
                                   onRequestCanceled:nil
                                     onRequestFailed:nil
                                   onProgressChanged:nil];

(5)再改改,会发现rows是在字典的第2层,这里我们要设置keyPath,因为是使用kvc进行关系映射的,所以改一下后的代码就是下面这样了:

    GQRequestParameter *parameter = [[GQRequestParameter alloc] init];

    GQObjectMapping *map = [[GQObjectMapping alloc]initWithClass:[ProductModel class]];//进行map的初始化,必须穿我们要映射的class

    [map addPropertyMappingsFromDictionary:[ProductModel attributeMapDictionary]];//往我们的map中加映射规则

    parameter.keyPath = @"result/rows";//需要map的层级

    parameter.mapping = map;

    [DemoHttpRequest requestWithRequestParameter:parameter
                                  onRequestStart:nil
                               onRequestFinished:^(GQBaseDataRequest *request, GQMappingResult *result){
                                   NSLog(@"%@",result.rawDictionary);
                                   NSLog(@"%@",result.array);
                               }
                               onRequestCanceled:nil
                                 onRequestFailed:nil
                               onProgressChanged:nil];

(6)这样我们打印的数组就是下面这样的,到此我们成功地完成了这个请求并拿到了想要的数据:

(
    "ProductModel:{ [course=0]  [pDescription=nil]  [enumId=4]  [picUrl=/nisefile/files/image/2015-12-29/5681edef0cf2a9072bd6be4a.jpg]  [price=99]  [pId=nil]  [likes=19]  [createTime=1451355631000]  [name=法香三文鱼] }"

)

链式调用 全程点语法支持

 [DemoHttpRequest1 prepareRequset]
 .requestUrlChain(@"product/list")
 .mappingChain(map)
 .keyPathChain(@"result/rows")
 .onFinishedBlockChain(^(GQBaseDataRequest * request, GQMappingResult * result){
     GQDPRINT(@"%@",result.rawDictionary);
     GQDPRINT(@"%@",result.array);
 })
 .onFailedBlockChain(^(GQBaseDataRequest * request, NSError * error){

 })
 .parametersChain(@{})
 .startRequestChain();

Model版本控制

在开发过程中,model中的property名称修改很常见,但修改名称后,对于以前版本的兼容可能导致无法映射。因此,我们需要对model进行版本控制。GQBaseModelObject支持设置修改过的属性名,可以支持不同版本的升级。

例如

app1.0版本的一个model中的属性名叫a,升级到1.1之后这个属性名修改为b,这时进行版本维护还是很容易的,只需将旧值映射到新的值中即可;

但如果升级到1.2之后又修改为c,升级到1.3版本又修改为d,进行版本控制时将存在很多问题,从1.0->1.3、1.0->1.2、1.1->1.3等等,情况很多;

这时,一个合适的版本控制方案就非常必要了。我们可以通过在继承自GQBaseModelObject的model中实现一个方法来完美解决这个问题。

- (NSArray *)versionChangeProperties;

上面那个例子中我们就可以这样做:

1.3版本就实现:

- (NSArray *)versionChangeProperties{
    return @[@"a->b->c->d"];
}

1.2版本就实现:

- (NSArray *)versionChangeProperties{
    return @[@"a->b->c"];
}

1.1版本就实现:

- (NSArray *)versionChangeProperties{
    return @[@"a->b"];
}

提示

1. 如果存在多个property名的修改,只需在数组中添加多条即可。2. 如果中间某个版本删除了字段,那么在这个版本中将property变化的全部删除。

总结

到这里我们就完美实现了每个版本升级对model的version控制,无论多少个版本更改都可以完美适配。

注意

在iOS9以上的系统需要添加plist字段,否则无法发起请求

NSAppTransportSecurity

<dict>

    <key>NSAllowsArbitraryLoads</key>

    <true/>

</dict>

支持

欢迎指出bug或需要改进的地方,欢迎提出issues,或联系qq:763007297,我会及时做出回应。