moya:RxSwift+Moya+ObjectMapper 优雅的网络请求

547 坐标: 94728 目录:婚姻家庭

RxSwift 结合 MVVM 简直的太合适不过了

我们将 网络请求放在 VM 里边

private let provider = RxMoyaProvider ( ) // 请求数据 provider .request ( .GetHomeList ) .filterSuccesulStatusCodes ( ) .mapJSON ( ) .mapObject ( type: LLHomeModel.self ) .subscribe ( onNext: { ( model ) in self.modelObserable.value = model.stories! }, onError: { ( error ) in } ) .addDisposableTo ( bag )

可以看到我们上边代码中 `provider

.request ( .GetHomeList )

.filterSuccesulStatusCodes ( )

.mapJSON ( ) .` 这个方法本身应该得到 JSON 的 但是我后边跟了一个 mapObject 的方法 这个方式可以直接根据 json 的格式转换成模型 或者是模型数组 来看一下这个方法 我是单独定义了一个 json 转模型的类 `LLToModelExtension.swift`

extension Observable{ func mapObject ( type: T.Type ) -> Observable{ return self.map { response in guard let dict = response as? [ String : Any ] else{ throw RxSwiftMoyaError.ParseJSONError } return Mapper ( ) .map ( JSON: dict ) ! } } func mapArray ( type: T.Type ) -> Observable { return self.map { response in //if response is an array of dictionaries, then use ObjectMapper to map the dictionary //if not, throw an error guard let array = response as? [ Any ] else { throw RxSwiftMoyaError.ParseJSONError } guard let dicts = array as? [ [ String: Any ] ] else { throw RxSwiftMoyaError.ParseJSONError } return Mapper ( ) .mapArray ( JSONArray: dicts ) } }}enum RxSwiftMoyaError: String { case ParseJSONError case OtherError}extension RxSwiftMoyaError: Swift.Error { }

介绍一下上边代码中各个方法以及名词

* 1 `mapObject` 方法是处理单个对象的 `mapArray` 处理对象数组

* 2 如果传进来的数据 是一个 `NSDictionary` 的话 那么就利用 `ObjectMapper` 的 `map` 方法映射这些数据,这个方法会调用你之前在 mapping 方法里面定义的逻辑。

* 3 如果 `response` 不是一个 `dictionary`, 那么就抛出一个错误。

* 4 在底部自定义了简单的 Error,继承了 Swift 的 Error 类,在实际应用过程中可以根据需要自己想要的 Error。

彩蛋

** 可能会有人问 为什么请求回来的数据 要赋值给 modelObserable.Value 呢 而不是赋值给一个模型数组 然后 reloadData 呢 **

这里我用的 RXSwift 里边 UItableView 绑定数据的一个方法 再也不用写一大串数据源方法了 这个也可以去 [ 这里 ] ( http://www.jianshu.com/p/00ded20182d2 ) 参考哦

var modelObserable = Variable ( [ ] ) //MARK: Rx 绑定 tableView 数据 modelObserable.asObservable ( ) .bind ( to: tableV.rx.items ( cellIdentifier: cellID, cellType: LLHomeCell.self ) ) { row , model , cell in cell.titleLbl.text = model.title cell.imageV?.kf.setImage ( with: URL.init ( string: ( model.images?.count ) ! > 0 ? ( model.images?.first ) ! : "" ) ) }.addDisposableTo ( bag )

[ Swift 项目框架地址 ] ( https://github.com/liuniuliuniu/LLProgramFramework.Swift )

参考文章

[ Moya 入坑记 ] ( http://www.codertian.com/2017/01/21/iOS-moya-ru-keng-usage/ )

[ RxSwift+Moya ] ( http://www.jianshu.com/p/c1494681400b )

专题栏目
最新