iOS一行代码搞定网络请求(AFNetWorking结合ReactiveCocoa)(3)

来源:互联网 发布:有什么好用的水乳 知乎 编辑:程序博客网 时间:2024/06/06 00:49

如要查看完整代码,请移步仿煎蛋github

1、响应式封装网络请求的优点

  • 统一处理(返回结果解析的统一处理,错误的统一处理)
  • 对网络异常情况的提前处理,和请求后的统一处理
  • 使用RACSignal的各种操作符,例如fiter,map,flatternMap,merge等,满足各种需求
  • 代码更简练优雅

2、网络监听

  • 实时监听
   [[[AFNetWorkUtils sharedAFNetWorkUtils] startMonitoringNet] subscribeNext:^(NSString *netStatus) {               //此处为每当网络状态改变时,自动调用,返回结果:1、WIFI 2、2G/3G/4G 3、网络已断开 4,其他情况 四种情况            }];
  • 获得当前的网络状态
[AFNetWorkUtils sharedAFNetWorkUtils].netType;

放回结果是一个枚举

typedef NS_ENUM(NSInteger, NetType) {    NONet,    WiFiNet,    OtherNet,};

3、 get请求

  [[AFNetWorkUtils get2racWthURL:url] subscribeNext:^(id result) {                //成功返回(result class is NSDictionary)            } error:^(NSError *error) {             //错误处理            }];
 [[AFNetWorkUtils racGETWithURL:url class:Weather.class] subscribeNext:^(id result) {               //直接获得模型对象(result class is NSObject or NSArray)            } error:^(NSError *error) {                //错误处理            }];

4、post请求

  [[AFNetWorkUtils racPOSTWthURL:url  params:params] subscribeNext:^(id result) {                //成功返回(result class is NSDictionary)            } error:^(NSError *error) {             //错误处理            }];
 [[AFNetWorkUtils racPOSTWithURL:url  params:params class:Weather.class] subscribeNext:^(id result) {               //直接获得模型对象(result class is NSObject or NSArray)            } error:^(NSError *error) {                //错误处理            }];

5、获取非JSON 数据(例如String类型数据)

  [[AFNetWorkUtils get2racUNJSONWthURL:unJSONUrl] subscribeNext:^(NSData *result) {                //返回结果为NSData 类型            }];

6、返回结果解析的统一处理,错误的统一处理

如果服务器返回的数据,都有固定的格式,如果在工具类进行统一的解析,就不用再每次网络请求时都去解析一次了。
例如

    {        "status": "ok",        "id": 2774402,         result:{         },    }或者{        "status": "ok",        "id": 2774402,         result:[         ], } 或者  {      "status": "error",      "error": "Post ID '61355' not found." }

则可直接获取result结果,或者错误信息。

7、对网络请求的各种需求(ReactiveCocoa方式的解决方案)

  • 同步的两次网络请求,即上一次的网络请求结果,是下一次网络请求的参数。

    例如authToken失效了,先去请求authToken,才能进行当前的请求(Flatternmap

[AFNetWorkUtils racGETWthURL:getAuthTokenURL] flattenMap:^RACStream *(NSString* authToken) {        return [AFNetWorkUtils racGETWthURL:nowURL];    };
  • 两个网络请求一步执行,但需要结果统一的处理

    例如,新闻类APP,都是先加载缓存数据,再加载网络数据,两个请 求结果都要加载到UITableView上。

[RACSignal merge:@[dbSignal, netSignal]];
  • 对请求的过滤(filter)
  • 对返回结果的二次处理(map)
  • 副作用(doNext)
  • 配合RACComand ,对请求开始,请求中,请求结束的处理
0 0
原创粉丝点击