前言
這一篇檐嚣,是一個仿Github注冊的表單頁面贮泞。官方針對這個例子移迫,介紹了用RxSwift實現(xiàn)MVVM居夹,一個是使用Driver 序列(針對UI界面的)败潦,另一個是Observable 序列。所以可以總結(jié)的知識點如下:
- MVVM的實現(xiàn)
- Observable序列和Driver序列的區(qū)別
功能說明
還是老樣子准脂,先說明這個例子做了什么劫扒。
其實就是一個很經(jīng)典的注冊表單界面:
- 輸入用戶名,檢驗用戶名是否存在
- 輸入密碼狸膏,檢驗密碼長度
- 輸入確認密碼沟饥,檢驗與上次輸入的密碼是否一致
- 注冊按鈕,當所有輸入內(nèi)容合法時湾戳,才能點擊
MVVM的優(yōu)點
以下摘自百度百科
MVVM模式和MVC模式一樣贤旷,主要目的是分離視圖(View)和模型(Model),有幾大優(yōu)點
- 低耦合砾脑。視圖(View)可以獨立于Model變化和修改幼驶,一個ViewModel可以綁定到不同的"View"上,當View變化的時候Model可以不變韧衣,當Model變化的時候View也可以不變县遣。
- 可重用性糜颠。你可以把一些視圖邏輯放在一個ViewModel里面,讓很多view重用這段視圖邏輯萧求。
- 獨立開發(fā)其兴。開發(fā)人員可以專注于業(yè)務邏輯和數(shù)據(jù)的開發(fā)(ViewModel),設計人員可以專注于頁面設計夸政,使用Expression Blend可以很容易設計界面并生成xml代碼元旬。
- 可測試。界面素來是比較難于測試的守问,而現(xiàn)在測試可以針對ViewModel來寫匀归。
Driver
Driver是RxSwift專門用于處理UI流的,相比Observable耗帕,它有以下特點:
- 不會發(fā)出Error
- 在主線程執(zhí)行
- 自動添加 shareReplayLatestWhileConnected()
Observable和Driver之間的轉(zhuǎn)換
Observable和Driver的用法基本一致穆端,以下是一個轉(zhuǎn)化例子
使用Observable:
validateUsername = input.username
.flatMapLatest { username in
return validationService.validateUsername(username)
.observeOn(MainScheduler.instance)
.catchErrorJustReturn(.failed(message: "Error contacting server"))
}
.shareReplay(1)
使用Driver:
validateUsername = input.username
.flatMapLatest { username in
return validationService.validateUsername(username)
.asDriver(onErrorJustReturn: .failed(message: "Error contacting server"))
}
使用 'Driver'的話,會自動地幫我們添加shareReplay(1)仿便,并且
.observeOn(MainScheduler.instance)
.catchErrorJustReturn(.Failed(message: "Error contacting server"))
等語句体啰,可以簡潔的寫為
.asDriver(onErrorJustReturn: .Failed(message: "Error contacting server"))
bindTo和driver
bindTo和driver的作用是一樣的,都是綁定結(jié)果嗽仪,可以直接這樣理解:
- bindTo用于Observable
- driver用于Driver
使用bindTo荒勇,這里的viewModel.validateUsername是Observable類型
viewModel.validateUsername
.bind(to: usernameValidationOutlet.rx.validationResult)
.disposed(by: disposeBag)
使用driver,這里的viewModel.validateUsername是Driver類型
viewModel.validateUsername
.drive(usernameValidationOutlet.rx.validationResult)
.disposed(by: disposeBag)
總結(jié)
具體的代碼就不分析了闻坚,其實就跟之前幾個例子是一樣的沽翔。這個例子精華在于MVVM的思想,通過ViewModel將視圖和模型綁定在一起窿凤,從而達到解耦的效果仅偎。