Swift - RxSwift的使用詳解4(Observable訂閱、事件監(jiān)聽、訂閱銷毀)

五、訂閱 Observable

有了 Observable,我們還要使用 subscribe() 方法來訂閱它,接收它發(fā)出的 Event。

第一種用法:

(1)我們使用 subscribe() 訂閱了一個Observable 對象,該方法的 block 的回調(diào)參數(shù)就是被發(fā)出的 event 事件,我們將其直接打印出來。

let observable = Observable.of("A", "B", "C")
         
observable.subscribe { event in
    print(event)
}

運行結(jié)果如下,可以看到:

  • 初始化 Observable 序列時設(shè)置的默認(rèn)值都按順序通過 .next 事件發(fā)送出來。
  • 當(dāng) Observable 序列的初始數(shù)據(jù)都發(fā)送完畢,它還會自動發(fā)一個 .completed 事件出來。

(2)如果想要獲取到這個事件里的數(shù)據(jù),可以通過 event.element 得到。

let observable = Observable.of("A", "B", "C")
         
observable.subscribe { event in
    print(event.element)
}

運行結(jié)果如下:

第二種用法:

(1)RxSwift 還提供了另一個 subscribe方法,它可以把 event 進行分類:

  • 通過不同的 block 回調(diào)處理不同類型的 event。(其中 onDisposed 表示訂閱行為被 dispose 后的回調(diào),這個我后面會說)
  • 同時會把 event 攜帶的數(shù)據(jù)直接解包出來作為參數(shù),方便我們使用。
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")
})

運行結(jié)果如下:

(2)subscribe() 方法的 onNext、onError、onCompletedonDisposed 這四個回調(diào) block 參數(shù)都是有默認(rèn)值的,即它們都是可選的。所以我們也可以只處理 onNext而不管其他的情況。

let observable = Observable.of("A", "B", "C")
         
observable.subscribe(onNext: { element in
    print(element)
})

運行結(jié)果如下:

六、監(jiān)聽事件的生命周期

1,doOn 介紹

(1)我們可以使用 doOn 方法來監(jiān)聽事件的生命周期,它會在每一次事件發(fā)送前被調(diào)用。

(2)同時它和 subscribe 一樣,可以通過不同的block 回調(diào)處理不同類型的 event。比如:

  • do(onNext:)方法就是在subscribe(onNext:) 前調(diào)用
  • do(onCompleted:) 方法則會在 subscribe(onCompleted:) 前面調(diào)用。

2,使用樣例

let observable = Observable.of("A", "B", "C")
 
observable
    .do(onNext: { element in
        print("Intercepted Next:", element)
    }, onError: { error in
        print("Intercepted Error:", error)
    }, onCompleted: {
        print("Intercepted Completed")
    }, onDispose: {
        print("Intercepted Disposed")
    })
    .subscribe(onNext: { element in
        print(element)
    }, onError: { error in
        print(error)
    }, onCompleted: {
        print("completed")
    }, onDisposed: {
        print("disposed")
    })

七、Observable 的銷毀(Dispose)

1,Observable 從創(chuàng)建到終結(jié)流程

(1)一個 Observable 序列被創(chuàng)建出來后它不會馬上就開始被激活從而發(fā)出 Event,而是要等到它被某個人訂閱了才會激活它。

(2)而 Observable 序列激活之后要一直等到它發(fā)出了.error或者 .completedevent 后,它才被終結(jié)。

2,dispose() 方法

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

(2)如果我們覺得這個訂閱結(jié)束了不再需要了,就可以調(diào)用 dispose()方法把這個訂閱給銷毀掉,防止內(nèi)存泄漏。

(3)當(dāng)一個訂閱行為被dispose 了,那么之后 observable 如果再發(fā)出 event,這個已經(jīng) dispose 的訂閱就收不到消息了。下面是一個簡單的使用樣例。

let observable = Observable.of("A", "B", "C")
         
//使用subscription常量存儲這個訂閱方法
let subscription = observable.subscribe { event in
    print(event)
}
         
//調(diào)用這個訂閱的dispose()方法
subscription.dispose()

3,DisposeBag

(1)除了 dispose()方法之外,我們更經(jīng)常用到的是一個叫 DisposeBag 的對象來管理多個訂閱行為的銷毀:

  • 我們可以把一個 DisposeBag對象看成一個垃圾袋,把用過的訂閱行為都放進去。
  • 而這個DisposeBag 就會在自己快要dealloc 的時候,對它里面的所有訂閱行為都調(diào)用 dispose()方法。

(2)下面是一個簡單的使用樣例。

let disposeBag = DisposeBag()
         
//第1個Observable,及其訂閱
let observable1 = Observable.of("A", "B", "C")
observable1.subscribe { event in
    print(event)
}.disposed(by: disposeBag)
 
//第2個Observable,及其訂閱
let observable2 = Observable.of(1, 2, 3)
observable2.subscribe { event in
    print(event)
}.disposed(by: disposeBag)

RxSwift使用詳解系列
原文出自:www.hangge.com轉(zhuǎn)載請保留原文鏈接

最后編輯于
?著作權(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)容

  • 發(fā)現(xiàn) 關(guān)注 消息 RxSwift入坑解讀-你所需要知道的各種概念 沸沸騰關(guān)注 2016.11.27 19:11*字...
    楓葉1234閱讀 2,944評論 0 2
  • 轉(zhuǎn)一篇文章 原地址:http://gank.io/post/560e15be2dca930e00da1083 前言...
    jack_hong閱讀 1,038評論 0 2
  • 本文章內(nèi)部分圖片資源來自RayWenderlich.com 本文結(jié)合自己的理解來總結(jié)介紹一下RxSwift最基本的...
    FKSky閱讀 3,052評論 4 14
  • 最近項目里面有用到Rxjava框架,感覺很強大的巨作,所以在網(wǎng)上搜了很多相關(guān)文章,發(fā)現(xiàn)一片文章很不錯,今天把這篇文...
    Scus閱讀 6,994評論 2 50
  • 昨晚完成裝修合同的簽署,也算一事告一段落,不知何時開始發(fā)現(xiàn)自己開始控制自己的嗓門與情緒,也越來越欣賞與自己交往中淡...
    大海小雨閱讀 290評論 0 0

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