函數響應式編程 清晰簡潔、易讀、易維護的代碼,下面咱們看下 RxSwift 的最佳搭檔:MVVMhtml
Model:數據層。負責讀寫數據,保存 App 狀態等面試
Controller:業務邏輯層。負責業務邏輯、事件響應、數據加工等工做算法
缺點:編程
缺點:markdown
做爲一個開發者,有一個學習的氛圍跟一個交流圈子特別重要,這是個人iOS交流圈: 無論你是小白仍是大牛歡迎入駐!! 分享內容包括跳槽面試資源、逆向安防、算法、架構設計、多線程,網絡進階,還有底層、音視頻、Flutter等等......網絡
本身根據梳理網絡來的的開發經驗總結的學習方法,無償分享給你們。更多資源,須要的話均可以自行來獲取下載。 +裙:196800191、 或者是+ WX(XiAZHiGardenia)免費獲取! 獲取面試資料 簡歷模板 一塊兒交流技術資源集合多線程
MVVM 是 Model-View-ViewModel 的簡寫。若是你已經對 MVC 很是熟悉了,那麼上手 MVVM 也是很是容易的。架構
MVC 是 Model-View-Controller 的簡寫。MVC 主要有三層:app
MVC 能夠幫助你很好的將數據,頁面,邏輯的代碼分離開來。使得每一層相對獨立。這樣你就可以將一些可複用的功能抽離出來,化繁爲簡。只不過,一旦 App 的交互變複雜,你就會發現 ViewController 將變得十分臃腫。大量代碼被添加到控制器中,使得控制器負擔太重。此時,你就須要想辦法將控制器裏面的代碼進一步地分離出來,對 APP 進行從新分層。而 MVVM 就是一種進階的分層方案。ide
MVVM 和 MVC 十分相識。只不過他的分層更加詳細:
沒錯,ViewModel 如今是邏輯層,而控制器只須要負責數據綁定。如此一來控制器的負擔就減輕了許多。而且 ViewModel 與控制器以及頁面相獨立。那麼,你就能夠跨平臺使用它。你也能夠很容易地測試它。
這裏咱們將用 MVVM 來重構輸入驗證。
重構前:
class SimpleValidationViewController : ViewController {
...
override func viewDidLoad() {
super.viewDidLoad()
...
let usernameValid = usernameOutlet.rx.text.orEmpty
.map { $0.characters.count >= minimalUsernameLength }
.share(replay: 1)
let passwordValid = passwordOutlet.rx.text.orEmpty
.map { $0.characters.count >= minimalPasswordLength }
.share(replay: 1)
let everythingValid = Observable.combineLatest(
usernameValid,
passwordValid
) { $0 && $1 }
.share(replay: 1)
usernameValid
.bind(to: passwordOutlet.rx.isEnabled)
.disposed(by: disposeBag)
usernameValid
.bind(to: usernameValidOutlet.rx.isHidden)
.disposed(by: disposeBag)
passwordValid
.bind(to: passwordValidOutlet.rx.isHidden)
.disposed(by: disposeBag)
everythingValid
.bind(to: doSomethingOutlet.rx.isEnabled)
.disposed(by: disposeBag)
doSomethingOutlet.rx.tap
.subscribe(onNext: { [weak self] in self?.showAlert() })
.disposed(by: disposeBag)
}
...
}
複製代碼
ViewModel 將用戶輸入行爲,轉換成輸出的狀態:
class SimpleValidationViewModel {
// 輸出
let usernameValid: Observable<Bool>
let passwordValid: Observable<Bool>
let everythingValid: Observable<Bool>
// 輸入 -> 輸出
init(
username: Observable<String>,
password: Observable<String>
) {
usernameValid = username
.map { $0.characters.count >= minimalUsernameLength }
.share(replay: 1)
passwordValid = password
.map { $0.characters.count >= minimalPasswordLength }
.share(replay: 1)
everythingValid = Observable.combineLatest(usernameValid, passwordValid) { $0 && $1 }
.share(replay: 1)
}
}
複製代碼
輸入:
輸出:
在 init
方法內部,將輸入轉換爲輸出。
ViewController 主要負責數據綁定:
class SimpleValidationViewController : ViewController {
...
private var viewModel: SimpleValidationViewModel!
override func viewDidLoad() {
super.viewDidLoad()
...
viewModel = SimpleValidationViewModel(
username: usernameOutlet.rx.text.orEmpty.asObservable(),
password: passwordOutlet.rx.text.orEmpty.asObservable()
)
viewModel.usernameValid
.bind(to: passwordOutlet.rx.isEnabled)
.disposed(by: disposeBag)
viewModel.usernameValid
.bind(to: usernameValidOutlet.rx.isHidden)
.disposed(by: disposeBag)
viewModel.passwordValid
.bind(to: passwordValidOutlet.rx.isHidden)
.disposed(by: disposeBag)
viewModel.everythingValid
.bind(to: doSomethingOutlet.rx.isEnabled)
.disposed(by: disposeBag)
doSomethingOutlet.rx.tap
.subscribe(onNext: { [weak self] in self?.showAlert() })
.disposed(by: disposeBag)
}
...
}
複製代碼
輸入:
輸出:
當 App 的交互變複雜時,你仍然能夠保持控制器結構清晰。這樣能夠大大的提高代碼可讀性。未來代碼維護起來也就會容易許多了。
Github Signup 來演示如何使用 MVVM。
注意⚠️:這裏介紹的 MVVM 並非嚴格意義上的 MVVM。但咱們一般都管它叫 MVVM,並且它配合 RxSwift 使用起來很是方便。如需瞭解什麼是嚴格意義上的 MVVM,請參考微軟的 The MVVM Pattern。