RxSwift-RxExample 學習系列(二)

4 github signup (Observable)

image.png

官方這里給的是一個mvvm 的注冊的例子
首先我先一部分一部分看

以username 為例子

==usernameTF (用戶名輸入)
==usernameLabel (用戶名檢查)

--分割線--


image.png

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

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,568評論 19 139
  • 本篇文章介主要紹RxJava中操作符是以函數(shù)作為基本單位,與響應式編程作為結合使用的,對什么是操作、操作符都有哪些...
    嘎啦果安卓獸閱讀 2,983評論 0 10
  • 概述 RxSwift顧名思義是Swift的一種框架,您或許曾經(jīng)聽說過「響應式編程」(Reactive Progra...
    Mr大喵喵閱讀 1,998評論 3 4
  • 文/隨藝 圖/來自網(wǎng)絡 你沒有什么好愧疚的,不必不敢直視我的眼睛。感情的事若是有主見,也不會輸給他人的建議。他不能...
    隨藝藝藝閱讀 990評論 4 9
  • YOUNG12閱讀 518評論 8 17

友情鏈接更多精彩內(nèi)容