美文网首页今日任务iOS OC 学习手册网络
现实中的网络开发(YYModel+AFNetworking)

现实中的网络开发(YYModel+AFNetworking)

作者: 溪石iOS | 来源:发表于2017-04-11 12:00 被阅读320次

    现实中的网络API

    json 已经成为现代网络 api 的标准数据格式,比如国家气象局的查询接口:
    http://www.weather.com.cn/data/sk/101010100.html

    {
        "weatherinfo": {
            "city": "北京",
            "cityid": "101010100",
            "temp": "18",
            "WD": "东南风",
            "WS": "1级",
            "SD": "17%",
            "WSE": "1",
            "time": "17:05",
            "isRadar": "1",
            "Radar": "JC_RADAR_AZ9010_JB",
            "njd": "暂无实况",
            "qy": "1011",
            "rain": "0"
        }
    }
    

    json 的格式一般为:

    • 对象(object):一个对象以{开始,并以}结束
    • 称/值(collection):名称和值之间使用隔开,一般的形式是:
    {name:value}
    

    现实中的iOS网络请求

    因为 iOS 提供的原生框架—— NSURLSession ——提供的方法要求很多底层参数,使用不直观,错误处理也不稳定,实际开发中我们都会选择网络框架,AFNetworking 是目前这方面的首选。它不单封装了 NSURLSession 的请求,还会自动分配请求队列,并格式化返回值,把 json 字符串转成 字典。总之就是省时省力。

    还有空气般无处不在的对象

    iOS开发中,任何数据都是基于OC对象,那么,问题来了:请求到的 json 数据怎么转成可使用的对象呢?
    一种实践是,自己定义一套APP端要用的对象,再逐个实现从字典转换的方法,每个请求都要自己实现一套,这个编码过程麻烦(且重复)不说,接口数量一多,还容易混乱。

    现实中我们依然借助一些优秀框架,帮助我们做这些转换,这里我们选择YYModel,它是YYKit中的一个子项目,可以单独使用。

    使用 pod 引入,在 Podfile 文件中添加:

    pod 'YYModel'
    

    运行:

    pod update
    

    引入头文件:

    #import <YYModel.h>
    

    首先需要定义对象:

    @interface WeatherInfo : NSObject
    @property(nonatomic, copy) NSString *city;
    @property(nonatomic, copy) NSString *cityid;
    @property(nonatomic, copy) NSString *temp;
    @property(nonatomic, copy) NSString *WD;
    @property(nonatomic, copy) NSString *WS;
    @property(nonatomic, copy) NSString *SD;
    @property(nonatomic, copy) NSString *WSE;
    @property(nonatomic, copy) NSString *time;
    @property(nonatomic, copy) NSString *isRadar;
    @property(nonatomic, copy) NSString *Radar;
    @property(nonatomic, copy) NSString *njd;
    @property(nonatomic, copy) NSString *qy;
    @property(nonatomic, copy) NSString *rain;
    @end
    

    属性名与 json 字段保持一致,这样才能正确转换。

    接着,用 AFNetworking 请求网络接口:

    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/plain",@"text/html",nil];
    [manager GET:@"http://www.weather.com.cn/data/sk/101010100.html"
          parameters:nil
            progress:nil
             success:^(NSURLSessionDataTask * _Nonnull task,
                       id  _Nullable responseObject) {
                 NSLog(@"%@", responseObject);
                 WeatherInfo *weather = [WeatherInfo yy_modelWithDictionary:responseObject[@"weatherinfo"]];
                 NSLog(@"%@", weather);
                }
             failure:^(NSURLSessionDataTask * _Nullable task,
                       NSError * _Nonnull error) {
        
                }];
    

    关键是WeatherInfo *weather = [WeatherInfo yy_modelWithDictionary:responseObject[@"weatherinfo"]];,直接将 json(这里是字典)转成了 WeatherInfo 对象。
    有些时候网络返回的字段名不符合 OC 代码规范,YYModel 也很贴心的提供了解决方案:

    #import "WeatherInfo.h"
    
    @implementation WeatherInfo
    + (NSDictionary *)modelCustomPropertyMapper {
        return @{@"windDirection" : @"WD"};
    }
    @end
    

    通过实现 modelCustomPropertyMapper 方法,我们可以手动指定转换后的属性名称。

    这样,现实开发中的大部分网络请求都可以自动完成了,最后,通过 ModelMaker 工具,可以自动将 json 转换成对象声明:

    ModelMaker
    下载地址:
    https://pan.baidu.com/s/1slEss13
    解压密码:xishiios

    相关文章

      网友评论

      本文标题:现实中的网络开发(YYModel+AFNetworking)

      本文链接:https://www.haomeiwen.com/subject/umlrottx.html