美文网首页今日任务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)

    现实中的网络API json 已经成为现代网络 api 的标准数据格式,比如国家气象局的查询接口:http://w...

  • STUN(RFC3489)的NAT类型检测方法

    最近开发公司的产品,需要进行远程操作,需要NAT穿透,就需要了解STUN协议。 在现实Internet网络环境中,...

  • 虚拟现实旅游项目

    未来,虚拟现实与网络连接足够发达。 某旅游城市开发了虚拟现实旅游项目,项目计划简介如下: 建立虚拟现实网络平台,接...

  • 网络暴力

    暴力, 向来是负面, 无论现实, 亦或是网络, 相比较, 现实中的各种暴力行为, 网络暴力更加恐怖, 现实中暴力是...

  • Android性能优化----网络优化

    现实开发中用到的性能优化方案 归纳如下: 网络发展至今,在生活中占着举足轻重的地位,网络让手机更多元化,现在恐怕手...

  • 网络封装处理(一)使用GCD同步网络请求

    现实开发中,经常会遇到这样的需求,一个页面需要批量发送几个网络请求,并且对这几个网络请求进行统一处理。这种情况直接...

  • Swift 顺序执行请求网络数据

    现实的iOS开发中,经常会遇到一个控制器有多个网络请求的情况,而这些网络请求我们又需要控制一下返回的先后顺序。比如...

  • IPV6问题 -- 官方文档

    指南和示例代码开发人员 搜索 网络概述 目录 介绍 为现实世界网络设计 评估您的网络需求 发现和广告网络服务 显示...

  • 虚拟网络讲真话,现实真人假话多

      现实中的真人,在现实中,有时候很假;现实中的真人,在虚拟的网络世界中,有时候也很真。   在现实的世界中,或许...

  • Android Retrofit 2.5.0使用基础详解

    前言 在Andrroid开发中,网络请求必不可少 而在Android所有网络请求库中,Retrofit是最受开发者...

网友评论

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

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