iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 27
0
Mobile Development

RxSwift / 30天探索之旅系列 第 27

第 27 天 - Driver

  • 分享至 

  • xImage
  •  

今天回頭講講一個Observable的變化型Driver,這應該是在第1x天講的內容,當初沒講是覺得好像沒很重要(?),但再次看Top mistakes in RxSwift you want to avoid - Code in a suit這篇文章時,看到新手常見錯誤『Not using drivers on UI』,加上不久前研究到Scheduler,想想好像是滿重要的,所以回過頭來補補。

Driver

特色

Driver有幾個特色

  1. 只執行在MainScheduler
  2. 不處理.error
  3. 有shareReplay(1)的作用

看完這特性就知道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訂閱的,除此之外也免去寫一些語法,減少人為犯錯機會。


倒數三天了,一切都快結束了,就這樣,明天見


上一篇
第 26 天 - Two Way Binding
下一篇
第 28 天 - RxGesture
系列文
RxSwift / 30天探索之旅30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言