以下資料參考自Ref,這裡僅作個人學習整理
Rx的一個核心觀念就是observable(或叫sequence ),口訣就是,Everything is a SEQUENCE,大意就是在Rx的世界,都是由observable構成。
Observable的生命週期:
- 使用.subscribe來訂閱Observable
- 當訂閱者收到Observable發出的.next、.error、.completed事件時,會依據我們定義好的程式執行
- Dispose
Note:
當我們subscribe()時,就會產生一個Disposable,當今天deinit時,Observable卻還沒結束,這時裝在DisposeBag中的所有Disposable就會執行dispose(),藉此來釋放資源
建立Observable方式:
- .of
- .interval
- .just
- .from
- .never (p.s. 不會發送也不會結束的Observable)
- .empty (p.s. 只會發送.completed的Observable)
- .error (p.s. 只會發送.error的Observable,在測試的時候比較常用到。)
- .create (p.s. 提供你客製化Observable方式)
Subject:
他同時是Observable跟Observer
Note:
疑問: 為什麼需要「Subject」? 單純是為了方便簡化code??
Subject種類?:
- PublishSubject (p.s. 開始是空的,只會發送新的元素給訂閱者)
- BehaviorSubject (p.s. 它定義是『開始是預設值,發送目前的最後一個值給訂閱者』,也就是說你不管什麼時候訂閱,都會有元素可以收到(至少有預設值)。)
- ReplaySubject (p.s. 開始時給訂一個暫存大小(buffer size),發送時會將最後的n個元素存進暫存,並將暫存的元素發給訂閱者)
- AsyncSubject(這很少用到,就不提了)
- PublishRelay (p.s. 只接受.next事件,不接受.error或.completed. Note: 從source code來看,PublishRelay其實就是PublishSubject再包一層)
- BehaviorRelay(p.s. 只接受.next事件,不接受.error或.completed. Note: 從source code來看,BehaviorRelay其實就是BehaviorSubject再包一層)
注意事項:
你會發現,Subject在同個class或是不同class被到處被onNext(),Relay被到處.accept(),這樣我們又回到Imperative思維,並且在Imperative上包一層的感覺,反而更不舒服,寫久了會很亂,也會常常出錯。
EX:
Observable
.subscribe(onNext: {
observerA.onNext(…)
observerB.onNext(…)
observerC.onNext(…)
})
.disposed(by: disposeBag)
#
Filtering Observables:
使用範例:
Observable.of(1, 2, 3, 4, 5)
.debug(“A")
.filter { $0 % 2 == 1 }
.debug(“B")
.subscribe()
.disposed(by: disposeBag)
說明:
只有滿足closure內條件的元素才會被執行
Skip Observables:
「skip」使用範例:
Observable.of(1, 2, 3, 4, 5)
.skip(2)
.debug(“B")
.subscribe()
.disposed(by: disposeBag)
說明:
略過前兩個元素(i.e. 1, 2)
「skipWhile」使用範例:
Observable.of(1, 3, 5, 6, 7)
.skipWhile { $0 % 2 == 1 }
.debug(“B")
.subscribe()
.disposed(by: disposeBag)
說明:
略過符合條件的元素,直到遇到不符合條件的元素(即 false),就停止略過
p.s. 範例中的1, 3, 5, 6, 7,只有6和7會執行
「skipUntil」使用範例:
let subject = PublishSubject()
let trigger = PublishSubject()
subject
.skipUntil(trigger)
.debug(“B")
.subscribe()
.disposed(by: disposeBag)
subject.onNext(“1″)
subject.onNext(“2″)
trigger.onNext(())
subject.onNext(“3″)
subject.onNext(“4″)
說明:
定義『略過元素,直到另一個Observable發送元素,就停止略過』,跟前面兩種相比,前面兩種是靜態的設定過濾條件,skipUntil則是可以基於另一個Observable 去動態過濾元素。
Take Observables:
take跟skip就是相反的存在,前者是取的n個元素,後者是略過n個元素,同樣的,它也有takeWhile跟takeUntil。
DistinctUntilChanged:
定義『排除重複的元素,直到不是重複時,才會發出』,比如下方範例,當true轉false時才會發送元素
使用範例:
Observable.of(true, true, false, false, true, false)
.distinctUntilChanged()
.debug(“B")
.subscribe()
.disposed(by: disposeBag)
執行結果:
B -> subscribed
B -> Event next(true)
B -> Event next(false)
B -> Event next(true)
B -> Event next(false)
B -> Event completed
B -> isDisposed