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 )
- 苹果4g网络慢是什么原因
- 中国移动4g网络
- 网络远程监控摄像头
- 网络电缆被拔出怎么解决办法
- cmcc是什么网络
- 蓝牙共享网络怎么用
- 网络防火墙在哪
- 平板电脑怎么连接网络
- 网络打印机无法连接
- 爱奇艺显示网络异常
- 广电网络宽带电话
- usb共享网络怎么连接
- 华为无法访问移动网络
- 如何设置网络打印机共享
- 网络重生txt下载
- 优雅的凯特王妃
- 金砖国家网络大学名单
- 网络十大恶心笑话
- 预防网络诈骗 会议记录
- 网络安全法会议记录
- 电脑右下角网络连接图标不见了
- 大华何海康的网络摄像机哪个好呢
- 微信网络连接不可用怎么回事
- 电脑没有网络连接怎么办
- 为什么移动4g网络那么慢
- 广电网络客服电话
- 电视有线网络怎么连接
- 网络机顶盒怎么连wifi
- 联通网络不好怎么办
- 联通网络客服电话
- 手机没有4g网络了怎么回事
- 为什么网络老是掉线
- win10右下角网络图标不见了
- 网络连接配置异常怎么修复
- 手机网络不好是什么原因
- iphone网络设置
- 网络已连接不可上网怎么回事
- 蜂窝网络是什么意思
- 手机拨号无法连接网络
- 开了移动数据没有网络
- 手机网络怎么共享给电脑
- 网络打印机连接
- 网络电缆被拔出
- 电力生产三级安全网络会议记录
- 张大千擅长:下列哪一位著名画家擅长画虎A、张
- 中通400客服电话
- 怎么换身份证上的照片
- 专硕和学硕代码
- 中国法律还有死刑吗
- 在六点半用英语怎么说
- 主任医师是什么级别
- 知困下一句:人心齐泰山移人心散请问下一句是什么
- 怎么缩小电脑桌面图标
- 专业技术岗位:事业单位管理岗位如何转专业技术岗位
- 天龙八部中逍遥派
- 苹果平板忘记id及密码怎么办
- 可可以加什么偏旁
- 什么夺目成语四字词语
- 蛋挞底皮酥脆的诀窍
- 中国联通电话号码客服电话是
- 星星还是那颗星星歌曲
- 顺丰有单号查不到物流
- iphone设置短信中心号码失败
- oppo自动开关机在哪里设置
- 灭楚之战有多惨
- 迂回什么折成语
- 案件到法院多久能开庭
- 武汉人流俱佳都巿
- 春雨绵绵的意思
- b的大写字母怎么写
- 物什么什么什么成语
- 现任国家副主席都有谁
- 打印表格怎么铺满a4纸
- 一什么玻璃填量词