RxSwift(三) - Observable訂閱、監(jiān)聽、銷毀

一、訂閱

創(chuàng)建了 Observable 序列, 還需要用 subscribe() 方法來訂閱它,以接收該序列發(fā)出的 Event .

  • 訂閱方法一

(1) 使用 subcribe() 訂閱 Observable 對象, 用 block 來接收 Event 事件

//創(chuàng)建
let observable  = Observable.of("A","B");
//訂閱
observable.subscribe { event in
    print(event);
}

//輸出結(jié)果
next(A)
next(B)
completed

(2) 使用 event.element 來獲取事件中的數(shù)據(jù)

//創(chuàng)建
let observable  = Observable.of("A","B");
//訂閱
observable.subscribe { event in
    print(event.element);//輸出數(shù)據(jù)
}

//輸出結(jié)果
Optional("A")
Optional("B")
nil
  • 訂閱方法二

(1) RxSwift 還提供另一個 subscribe 方法, 可以將 Event 進(jìn)行分類, 通過不同的 閉包 回調(diào)處理不同類型的 Event, 同時會把 Event 攜帶的數(shù)據(jù)直接解包出來作為參數(shù)

//創(chuàng)建
let observable  = Observable.of("A","B","C");
//訂閱
observable.subscribe(onNext: { (element) in
    print(element)
}, onError: { (error) in
    print(error)
}, onCompleted: {
    print("completed")
},onDisposed:  {
    print("disposed") // onDisposed 表示訂閱行為被 dispose 后的回調(diào)
})

//輸出結(jié)果
A
B
C
completed
disposed

(2) subscribe() 方法的 onNextonError、 onCompletedonDisposed 這四個回調(diào)都是有默認(rèn)值的,所以這些方法不是必須的,可以選擇執(zhí)行某個方法.

//創(chuàng)建
let observable  = Observable.of("A","B","C");
//訂閱
observable.subscribe(onNext: { (element) in
    print(element)
})

//輸出結(jié)果
A
B
C

二、監(jiān)聽事件的聲明周期

  • doOn

(1) 使用 doOn 來監(jiān)聽事件的聲明周期, 會在每次事件發(fā)送之前被調(diào)用

(2) 和 subscribe 事件一樣, 可以通過不同的閉包回調(diào)來區(qū)分 Event 事件類型, 比如 : do(onNext:) 方法在 subscribe(onNext:) 之前調(diào)用.

let observable = Observable.of("A","B","C")
observable.do(onNext: { (element) in
    print("-- \(element)")
}, onError: { (error) in
    print("-- error")
}, onCompleted: {
    print("-- completed")
}, onSubscribe: {
    print("-- subscribe1")
}, onSubscribed: {
    print("-- subscribe2")
}, onDispose: {
    print("-- disposed")
})
.subscribe(onNext: { (element) in
    print(element)
}, onError: { (error) in
    print(error)
}, onCompleted: {
    print("completed")
}, onDisposed: {
    print("disposed")
})

//輸出結(jié)果
-- subscribe1
-- subscribe2
-- A
A
-- B
B
-- C
C
-- completed
completed
disposed
-- disposed

Observable 銷毀(Dispose)

  • Observable 從創(chuàng)建到銷毀流程

(1) 一個 Observable 序列被創(chuàng)建出來后,不會馬上被激活發(fā)送 Event, 而是等到它被訂閱后才會被激活.
(2) Observable 激活之后, 一直等到它發(fā)出 .error 或者 .completed 之后, 才會被銷毀

  • dispose()

(1) 使用該方法可以手動取消一個訂閱行為

(2) 如果一個訂閱行為被 dispose 了, Observable 序列再發(fā)出 Event, 訂閱者不會受到消息

  • DisposeBag

除了 dispose() 方法之外, 還可以使用 DisposeBag 對象來管理多個訂閱的銷毀行為, 我們可以把 DisposeBag 看做一個容器, 將所有訂閱行為存放到容器中, DisposeBagdealloc 的時候,會對其中存儲的所有訂閱行為執(zhí)行 dispose() 方法進(jìn)行銷毀.

let disposeBag = DisposeBag()
let observable1 = Observable.of("A","B");
observable1.subscribe { (event) in
    print(event)
}.disposed(by: disposeBag)
let observable2 = Observable.of("A","B");
observable2.subscribe { (event) in
    print(event)
}.disposed(by: disposeBag)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容