新手自学ios 之 利用YYModel封装网络请求返回model

来源:互联网 发布:淘宝买太多了会怎么样 编辑:程序博客网 时间:2024/05/21 19:37

 很多时候,我们在做项目的时候,服务端返回给我们的数据类型(json),很多格式如下,我们如果每个model 中都去写 total,resultCode 什么的,又很麻烦。

{  data: [    {      name: "张三",      icon: "http://~~~~~hahaha.png",      age: 18,      sex: "男",      address: "天安门广场",    }  ],  resultMessage: "查询成功",  resultCode: "0",  total: 1}

如上,可以看出,data 对应一个NSArray ,其中一个{} 包含的是一个 model ,加入是一个User 类。


现在记录我的解决方法

  一、定义基类 CommonResponse,如下

@interface WSCommonResponse : NSObject/** *  判断是否成功,0是成功 */@property(nonatomic,assign) int ret;/** *  描述信息 */@property(nonatomic,copy) NSString *desc;/** *  数据源 */@property(nonatomic,strong) NSArray *data;/** *  数据量 */@property(nonatomic,assign) int total;/** *  判断请求是否成功 */- (BOOL) isSuccess;/** *  判断是否有数据源 */- (BOOL) hasData;@end

二、这时候,我们新建继承自CommonResponse一个实体类,假如是个 TestResult类 , 这个类有来自于父类的几个属性,其中有个data 属性是NSArray 类型,如果让 YYModel 知道 NSArray 装的是 User 类呢?

#import "WSCommonResponse.h"@interface WSTestResult : WSCommonResponse+ (NSDictionary *)modelContainerPropertyGenericClass;@end@interface WSUser : NSObject@property(nonatomic,assign) int age;@property(nonatomic,copy) NSString *name;@property(nonatomic,copy) NSString *sex;@property(nonatomic,copy) NSString *icon;@property(nonatomic,copy) NSString *phone;@property(nonatomic,copy) NSString *address;@end

上面 用到一个方法,是通过反射把 User 类转 父类中NSArray 的具体类的作用

+ (NSDictionary *)modelContainerPropertyGenericClass {    return @{@"data" : [WSUser class]};}


此时我们再用的时候就直接调用

<pre name="code" class="objc">WSTestResult *result = [WSTestResult yy_modelWithJSON:responseObject];  if (result.isSuccess) {            //请求成功            if(result.hasData){                //有数据                //do something u want ...                //取出数据                WSUser *user = result.data[0];            } else {                //没有数据                [self showInfo:result.desc];            }        } else {            //接口畅通,但是请求失败了(非网络等其他原因)            [self showError:result.desc];        }



其中 responseObject 是AFNetworking 调用成功的时候返回的 json,

这样我们就完成了 服务端返回json 的封装

0 0