RXswiftRxSwift学习

RxSwift-RxExample 学习系列(二)

2017-12-08  本文已影响12人  奇董

4 github signup (Observable)

image.png

官方这里给的是一个mvvm 的注册的例子
首先我先一部分一部分看

以username 为例子

==usernameTF (用户名输入)
==usernameLabel (用户名检查)

--分割线--


image.png

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

上一篇 下一篇

猜你喜欢

热点阅读