时间:2021-05-19
一、说明
入坑RxSwift 有段时间了,之前在项目中只是小范围的使用RxSwift,为了更好的使用响应式编程,决定在项目中更广范围的使用RxSwift,然后研究了一下RxSwift的网络请求,现在有关网络请求的案例大多是基于RXSwift(4.0.0)或者更早的库来写的,本篇文章是基于目前最新的版本(4.2.0)版本来写的,由于RxSwift 版本的更新,里面的使用语法,发生了变化,在整理的过程中遇到了一些问题,为了让后来学习的小伙伴,节约时间,决定记录下来
二、网络请求
1.使用RxSwift相关库的版本
2.在Swift语言中,我们使用Alamofire 作为网络库,moya 是对Alamofire 更抽象一层的封装,RxSwift把Moya封装后作为网络请求的接口,我们在使用的时候只需要实现 TargetType 协议就好,用一个例子来看下怎么使用:
首先,我们定义了一个 枚举 APIService ,作用主要是在内部定义网络请求的接口,然后,就是对协议 TargetType进行扩展,我们一一解读下里面的参数
3.在进行网络请求之前,需要做一些准备工作,把网络请求回的数据通过JSON 转化成 Model , 这里我们使用了两种方式进行转换(根据项目的情况,灵活选择使用),一种通过 ObjectMapper库进行转换,一种是通过 HandyJSON 库 进行转换 ,分别通过对 Response 类 扩展 ,以下是对这两种方式的封装
其一:使用 ObjectMapper库 把JSON 转换成 Model
import Foundationimport RxSwiftimport Moyaimport ObjectMapper// MARK: - Json -> Modelextension Response { func mapObjectModel<T: BaseMappable>(_ type: T.Type, context: MapContext? = nil) throws -> T { guard let object = Mapper<T>(context: context).map(JSONObject: try mapJSON()) else { throw MoyaError.jsonMapping(self) } return object } func mapObjectArray<T: BaseMappable>(_ type: T.Type, context: MapContext? = nil) throws -> [T] { guard let array = try mapJSON() as? [[String : Any]] else { throw MoyaError.jsonMapping(self) } return Mapper<T>(context: context).mapArray(JSONArray: array) }}// MARK: - Json -> Observable<Model>extension ObservableType where E == Response { // 将Json解析为Observable<Model> public func mapObjectModel<T: BaseMappable>(_ type: T.Type) -> Observable<T> { return flatMap { response -> Observable<T> in return Observable.just(try response.mapObjectModel(T.self)) } } // 将Json解析为Observable<[Model]> public func mapObjectArray<T: BaseMappable>(_ type: T.Type) -> Observable<[T]> { return flatMap { response -> Observable<[T]> in return Observable.just(try response.mapObjectArray(T.self)) } }}其二 : 使用 HandyJSON 库 把JSON 转化成 Model
import Foundationimport RxSwiftimport Moyaimport HandyJSONextension ObservableType where E == Response { public func mapHandyJsonModel<T: HandyJSON>(_ type: T.Type) -> Observable<T> { return flatMap { response -> Observable<T> in return Observable.just(response.mapHandyJsonModel(T.self)) } }}extension Response { func mapHandyJsonModel<T: HandyJSON>(_ type: T.Type) -> T { let jsonString = String.init(data: data, encoding: .utf8) if let modelT = JSONDeserializer<T>.deserializeFrom(json: jsonString) { return modelT } return JSONDeserializer<T>.deserializeFrom(json: "{\"msg\":\"请求有误\"}")! }}4.在MainClassViewModel中,使用已经封装好的接口进行网络请求,代码如下:
这里用了两种方式,分别对 mainClassList API 接口进行了网络请求,唯一不同的是,在得到到网络请求回来数据的时候,一个是使用 mapObjectModel 把JSON 转化成 Model ,一个是使用 mapHandyJsonModel 把 JSON转化成Model ,由于我们使用的是不同的库,把JSON 转化成 Model,这两种实现的方式还是有一些差别,下面是这两种 Model 的具体实现方式:
其一、实现协议 Mappable
import UIKitimport ObjectMapperclass MainClassModelMapObject: Mappable { var code:NSInteger? var data:[MainClassModelMapObject_sub]! required init?(map: Map) {} func mapping(map: Map) { code <- map["code"] data <- map["data"] }}class MainClassModelMapObject_sub: Mappable { var ID:String? var name:String? var desc:String? var imgUrl:String? var gifUrl:String? var isUpdate:Bool? var backgroundGroup:NSInteger? required init?(map: Map) {} func mapping(map: Map) { ID <- map["ID"] name <- map["name"] desc <- map["desc"] imgUrl <- map["imgUrl"] gifUrl <- map["gifUrl"] isUpdate <- map["isUpdate"] backgroundGroup <- map["backgroundGroup"] }}其二、实现协议 HandyJSON
import UIKitimport HandyJSONstruct MainClassModel: HandyJSON { var code:NSInteger? var data:[MainClassModel_sub]!}struct MainClassModel_sub: HandyJSON { var ID:String? var name:String? var desc:String? var imgUrl:String? var gifUrl:String? var isUpdate:Bool? var backgroundGroup:NSInteger?}5、以上是使用 RxSwift 进行网络请求的分析,接下来看一个示例如何使用,在MainClassViewModel 中我们使用 dataSource 保存了网络请求回来的数据,我们要在 ViewController里 用tableview 把这个数据展示出来,需要提前把数据源和TableView进行绑定,以下是示例代码:
在需要使用的地方,调用 方法 getClassListWithMapObject() 或者 getClassListWithMapHandyJson()
三、总结
这部分的内容,适合对RxSwift 有一定了解的小伙伴学习, 文章重点是 帮助大家学习和了解 RxSwift 网络请求的相关知识,下面是一个写好的demo
demo
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
前言我们在前一篇基础之上,本文将会介绍RxSwift中的Observables部分。在RxSwift中Observable也被称为ObservableSeque
本文介绍了浅谈在Vue-cli里基于axios封装复用请求,分享给大家,具体如下:安装只用安装一个axios就可以了。npminstallaxios--save
简要介绍Retrofit是当前应用非常广泛的网络请求框架,通常结合RxJava来进行网络请求,本文将展示一个采用RxJava+Retrofit的网络请求demo
微信小程序网络请求GET微信小程序开发中网络请求必不可少,今天说说最简单的请求.后续会尝试上传下载,Socket这些.1.一个微信小程序,同时只能有5个网络请求
Android中Volley二次封装并实现网络请求缓存Android目前很多同学使用Volley请求网络数据,但是Volley没有对请求过得数据进行缓存,因此需