4 github signup (Observable)

官方這里給的是一個mvvm 的注冊的例子
首先我先一部分一部分看
以username 為例子
==usernameTF (用戶名輸入)
==usernameLabel (用戶名檢查)
--分割線--

1 首先vc 初始化vm vm獲取到username輸入的信號序列
2 vm 內(nèi)部 根據(jù)username的信號序列 轉(zhuǎn)化為 提示的信號序列(這邊提示是用的一個枚舉返回的)
這里我一開始的第一反應是,肯定是返回一個String的信號序列啊
直接bind到label上面多簡單。 結果秒打臉,來看下如果返回String是什么樣的結果:
首先 返回Observable<string>
肯定秒bind label.rx.text 這時候提示沒有問題
可是發(fā)現(xiàn)不同的提示會有不同的顏色問題??
一個map 搞定,然后bind textColor搞定。雖然判斷文字,代碼有點丑陋,但是簡單嘛。
可是到確定 注冊按鈕的可點擊狀態(tài)的時候,這里就有點懵逼了。 注冊按鈕的狀態(tài)與 3個TF的狀態(tài) 有關。但是我3個TF 都返回的是字符串序列,而且文字提示都不一樣。。。。。然后為這地方用combineLatest 獲取2個字符串序列瘋狂判斷。 真是丑到天際。
參考demo的做法,感覺還是很舒服的
首先同統(tǒng)一驗證結果
//驗證結果枚舉
enum ValidationResult {
case ok(message: String)
case empty
case validating
case failed(message: String)
}
// 驗證枚舉轉(zhuǎn)化為 BOOL類型 便于bind 注冊狀態(tài)
extension ValidationResult {
var isValid: Bool {
switch self {
case .ok:
return true
default:
return false
}
}
}
// 轉(zhuǎn)化為 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
}
}
}
// 轉(zhuǎn)化為 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
}
}
}
統(tǒng)一了信號內(nèi)容,也便于理解
還有demo的signup 加載的hud 是自己擴展的。我們平時也用不到,我們平常應該是點擊 彈出HUD 然后加載。
這時候
只要幫signup的信號 通過map 調(diào)用show/hide方法 就可以了。我現(xiàn)在是這么理解的。
signup 處理的網(wǎng)絡請求 可能有網(wǎng)絡超時,服務器關閉 等等一系列的報錯。這時候我們可以仿照上面 ValidationResult 來寫一個 reponseResult 無論是網(wǎng)絡錯誤 還是 請求成功 都被包在reponseReslut中傳遞。最后到顯示的時候 顯示結果。
demo具體的網(wǎng)絡請求和顯示過程,不是很具有實戰(zhàn)價值 這里就不描述了。也不難理解
5 github signup(Driver)
將vm輸出的 Observable 都變?yōu)镈river
在實際的開發(fā)中我們都是用Driver來代替Observable
Driver 區(qū)別于 Observable
1 不能調(diào)用onError
2 工作在主線程
3 默認share
driver 只能工作在主線程,所以不能切換線程。而且不能捕獲error .這時候?qū)⑿盘柡蚭rror 統(tǒng)一封裝,比較重要。
我目前vm output都是Driver