今天回頭講講一個Observable的變化型Driver
,這應該是在第1x天講的內容,當初沒講是覺得好像沒很重要(?),但再次看Top mistakes in RxSwift you want to avoid - Code in a suit這篇文章時,看到新手常見錯誤『Not using drivers on UI』,加上不久前研究到Scheduler,想想好像是滿重要的,所以回過頭來補補。
Driver有幾個特色
.error
看完這特性就知道Driver是用在UI上的,上面那篇文章的大大也提出一個準則
只要給ViewController或是UIView訂閱的Observable都應該使用Driver
如果是將原本Observable改成Driver,基本上改兩個地方,比如說表示indicator是否在loading的isLoading
第一
把Observable改為Driver,並使用asDriver()
轉成Driver
// ViewModel.swift
let isLoading: Driver<Bool>
let indicator = ActivityIndicator()
isLoading = indicator.asDriver()
並不是每個都能直接使用轉換的,若是原先就有處理.error
事件的,像是Subject,那再轉換成Driver時,就要定義當發生.error
要如何進行處理,最簡單就是onErrorJustReturn
let subject = BehaviorSubject<String>(value: "A")
let driver = subject.asDriver(onErrorJustReturn: "B")
除此之外,像是Relay就能直接轉成Driver
第二
變成Driver就不是在使用bind(to: )
了,需要把原本的bind(to: )
改為drive()
// ViewController.swift
viewModel.isLoading.drive(refreshControl.rx.isRefreshing).disposed(by: disposeBag)
今天講Driver就到這,不管是Operator還是Observable類型的選擇,個人覺得還是月精確越好,在閱讀上,一看就知道Driver基本上就提供UI訂閱的,除此之外也免去寫一些語法,減少人為犯錯機會。
倒數三天了,一切都快結束了,就這樣,明天見