RxSwift-RxExample 学习系列(二)
4 github signup (Observable)

官方这里给的是一个mvvm 的注册的例子
首先我先一部分一部分看
以username 为例子
==usernameTF (用户名输入)
==usernameLabel (用户名检查)
--分割线--

1 首先vc 初始化vm vm获取到username输入的信号序列
2 vm 内部 根据username的信号序列 转化为 提示的信号序列(这边提示是用的一个枚举返回的)
这里我一开始的第一反应是,肯定是返回一个String的信号序列啊
直接bind到label上面多简单。 结果秒打脸,来看下如果返回String是什么样的结果:
首先 返回Observable<string>
肯定秒bind label.rx.text 这时候提示没有问题
可是发现不同的提示会有不同的颜色问题😢
一个map 搞定,然后bind textColor搞定。虽然判断文字,代码有点丑陋,但是简单嘛。
可是到确定 注册按钮的可点击状态的时候,这里就有点懵逼了。 注册按钮的状态与 3个TF的状态 有关。但是我3个TF 都返回的是字符串序列,而且文字提示都不一样。。。。。然后为这地方用combineLatest 获取2个字符串序列疯狂判断。 真是丑到天际。
参考demo的做法,感觉还是很舒服的
首先同统一验证结果
//验证结果枚举
enum ValidationResult {
case ok(message: String)
case empty
case validating
case failed(message: String)
}
// 验证枚举转化为 BOOL类型 便于bind 注册状态
extension ValidationResult {
var isValid: Bool {
switch self {
case .ok:
return true
default:
return false
}
}
}
// 转化为 text
extension ValidationResult: CustomStringConvertible {
var description: String {
switch self {
case let .ok(message):
return message
case .empty:
return ""
case .validating:
return "validating ..."
case let .failed(message):
return message
}
}
}
// 转化为 color
extension ValidationResult {
var textColor: UIColor {
switch self {
case .ok:
return ValidationColors.okColor
case .empty:
return UIColor.black
case .validating:
return UIColor.black
case .failed:
return ValidationColors.errorColor
}
}
}
// 将 result 直接绑定到 label上的 text 和color 上
extension Reactive where Base: UILabel {
var validationResult: Binder<ValidationResult> {
return Binder(base) { label, result in
label.textColor = result.textColor
label.text = result.description
}
}
}
统一了信号内容,也便于理解
还有demo的signup 加载的hud 是自己扩展的。我们平时也用不到,我们平常应该是点击 弹出HUD 然后加载。
这时候
只要帮signup的信号 通过map 调用show/hide方法 就可以了。我现在是这么理解的。
signup 处理的网络请求 可能有网络超时,服务器关闭 等等一系列的报错。这时候我们可以仿照上面 ValidationResult
来写一个 reponseResult
无论是网络错误 还是 请求成功 都被包在reponseReslut中传递。最后到显示的时候 显示结果。
demo具体的网络请求和显示过程,不是很具有实战价值 这里就不描述了。也不难理解
5 github signup(Driver)
将vm输出的 Observable 都变为Driver
在实际的开发中我们都是用Driver来代替Observable
Driver 区别于 Observable
1 不能调用onError
2 工作在主线程
3 默认share
driver 只能工作在主线程,所以不能切换线程。而且不能捕获error .这时候将信号和error 统一封装,比较重要。
我目前vm output都是Driver