iOS - RxSwift项目实战

RxSwift项目实战

最普通的网络请求表格界面:
1. 项目结构
工程项目来自网络 iOS - RxSwift 项目实战记录
本文有摘录该博文的相关内容,若侵删

.
├── Controller
│ └── LXFViewController.swift // 主视图控制器
├── Extension
│ └── Response+ObjectMapper.swift // Response分类,Moya请求完进行Json转模型或模型数组
├── Model
│ └── LXFModel.swift // 模型
├── Protocol
│ └── LXFViewModelType.swift // 定义了模型协议
├── Tool
│ ├── LXFNetworkTool.swift // 封装Moya请求
│ └── LXFProgressHUD.swift // 封装的HUD
├── View
│ ├── LXFViewCell.swift // 自定义cell
│ └── LXFViewCell.xib // cell的xib文件
└── ViewModel
└── LXFViewModel.swift // 视图模型

2. 网络框架的搭建
Moya的使用
3. tableView数据源的绑定
使用RxDataSources框架,RxDataSources是以section来做为数据结构来传输,所以在使用RxDataSources的过程中,即使你的setion只有一个,那你也得返回一个section的数组出去。
1)一般现在model文件里先自定义一个section,使用库自带的SectionModel也行,但是扩展性不强,且写起来比较麻烦。
2)在控制器下创建一个数据源dataSource属性,根据业务实现必要的配置方法。常用方法对应tableView的UITableViewDataSource中各种代理方法。
3)将sections序列绑定给tableView的row

4. 设计ViewModel的规范
MVVM思想:
将原本在ViewController的视图显示逻辑、验证逻辑、网络请求等代码存放于ViewModel中,让我们手中的ViewController瘦身。这些逻辑由ViewModel负责,外界不需要关心,外界只需要结果,ViewModel也只需要将结果给到外界,基于此,可以为此定义一个协议LXFViewModelType
该协议定义一览:

LXFViewModelType.swift

// associatedtype 关键字 用来声明一个类型的占位符作为协议定义的一部分
protocol LXFViewModelType {
    associatedtype Input
    associatedtype Output

    func transform(input: Input) -> Output
}

我们根据业务逻辑定义ViewModel,并遵守ViewModelType协议。
具体的操作步骤,
一.可以根据业务需要重新给Input和Output定义别名,顾名思义
二.丰富Input和Output,比如Input中可以包含网络请求的类型;Output中可以包含我们的数据源,即sections
三.通过协议方法transform根据input生成一个Output
ViewModel的实现基本依照上面三步,其中transform方法中包含网络请求和数据处理逻辑。例中每个section的items(一个item对应tableView的一行)是一个Variable,当值改变时会通知订阅者,这是它的特性。
四.ViewModel定义完后,只要在控制器中初始化viewModel实例和input输入,再通过transform得到output输出。然后将output中的数据源属性绑定到tableview的每一行。

5. RxSwift中使用MJRefresh
如果业务还设计下拉刷新和上拉加载,就要使用到MJRefresh这个框架。结合RxSwift使用也很简单。
例中用一个枚举定义了刷新控件的每一种状态,并用Variable封装为ViewModel的output的一个属性,该属性供外部订阅,当刷新状态发生变化时即调用mj提供的对应方法响应。
而MJRefresh刷新时还需要提供一个驱动数据刷新(一般是网络请求)的方法,我们可以类似的定义一个属性,这回是PublishSubject(),一个布尔值用来判断是上拉还是下拉刷新。在对它的订阅中我们使用之前构建好的请求工具类进行网络请求和数据刷新。而在MJ的刷新方法中我们只要用Subject提供的onNext(:) 等Rx提供的简便写法让Subject发出事件就可以驱动数据刷新了。

最后附上该例作者做的流程总结:

  1. ViewController已经拿到output,当下拉加载数据的时候,使用output的requestCommond发射信息,告诉viewModel我们要加载数据
  2. viewModel请求数据,在处理完json转模型或模型数组后修改models,当models的值被修改的时候会发信号给sections,sections在ViewController已经绑定到tableView的items了,所以此时tableView的数据会被更新。接着我们根据请求结果,修改output的refreshStatus属性的值
  3. 当output的refreshStatus属性的值改变后,会发射信号,由于外界之前已经订阅了output的refreshStatus,此时就会根据refreshStatus的新值来处理刷新控件的状态

可以说是解释的相当清晰了,整个项目的骨架基本已经搭好,我们完全可以根据上面阐述的方法用RxSwift一步步地写出一个完整的单页面应用出来。复杂的页面其实也是以此为基础的,只不过是数据源的结构,数据的解析和处理,页面的UI元素和布局更加庞杂了而已。不过有一点可以确定,RxSwift生态圈替我们做了很多,帮我们剔掉了很多不必要的胶水代码,让我们可以更加专注到业务逻辑的开发中去。

你可能感兴趣的:(iOS - RxSwift项目实战)