久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

RxSwift學(xué)習(xí)之Observable的新建、訂閱及取消訂閱

這篇文章主要給大家介紹了關(guān)于RxSwift學(xué)習(xí)教程之Observable的相關(guān)資料,文中詳細(xì)的給大家介紹了關(guān)于新建Observable、訂閱Observable和取消訂閱并消除內(nèi)存泄漏等相關(guān)的內(nèi)容,需要的朋友可以

前言

我們在前一篇基礎(chǔ)之上,本文將會介紹 RxSwift 中的 Observables 部分。

在 RxSwift 中 Observable 也被稱為 Observable Sequence、Sequence、Stream。Observable 會以異步的方式不斷的發(fā)射事件形成事件流,并且數(shù)據(jù)也會沿著事件流進(jìn)行傳播。下圖是事件流的圖像化表示:

其中從左到右的箭頭代表時間軸,而三個圓圈則構(gòu)成了可觀察序列。而整個過程會按照從左到右的順序。另外,事件可能在可觀察序列生命周期內(nèi)的任意時刻被觸發(fā)。

Observable 生命周期

上圖中的三個圓圈其實(shí)就是 RxSwift 中的 next 事件。除了 next 之外,RxSwift 中還有 completed 和 error 事件,而這兩者都意味事件流生命周期的總結(jié)。

completed 所表示的正常終結(jié):

error 所表示的異常終結(jié):

在源碼中這三類事件的定義如下:


/// Represents a sequence event.
///
/// Sequence grammar: 
/// **next\* (error | completed)**
public enum Event<Element> {
 /// Next element is produced.
 case next(Element)

 /// Sequence terminated with an error.
 case error(Swift.Error)

 /// Sequence completed successfully.
 case completed
}

在代碼中,我們可以清晰的看到 next 事件會攜帶一個實(shí)例進(jìn)行傳播,error 事件會攜帶一個 Error 實(shí)例,completed 則什么都不會攜帶。

新建 Observable

在所有 Observable 對象的創(chuàng)建方法中,最簡單的就是 just :


// 1
let one = 1 
let two = 2 
let three = 3

// 2 
let observable: Observable<Int> = Observable<Int>.just(one)

作為類方法 just 所創(chuàng)建的 Observable 對象只會包含一個元素。但是大多數(shù)時候,Observable 對象在其生命周期內(nèi)會包含多個元素,而創(chuàng)建方法也很簡單:


let observable2 = Observable.of(one, two, three)

可能上面的代碼會給人一種誤導(dǎo),讓人覺得 observable2 中的數(shù)據(jù)可能是一個數(shù)組類型。不過好在我們可以通過下面的代碼進(jìn)行檢驗(yàn):


observable2.subscribe(onNext: { element in
  print(element) 
 })
 
/* 打印結(jié)果:
1
2
3
*/

而真正創(chuàng)建數(shù)組類型變量的方法是:


let observable3 = Observable.of([one, two, three])
observable3.subscribe(onNext: { element in
  print(element) 
 })
 
/* 打印結(jié)果:
[1, 2, 3]
*/

上面只是幾個常用的 Observable 創(chuàng)建方法,更多的內(nèi)容可以去查文檔和代碼。

訂閱 Observable

在日常 iOS 編程中,通知模式可以說是使用頻率相當(dāng)高的一個設(shè)計模式。我們通過 NotificationCenter 實(shí)現(xiàn)消息的廣播和訂閱。下面是一個典型的通知模式代碼用于處理 UIKeyboardDidChangeFrame 消息:


let observer = NotificationCenter.default.addObserver( 
forName: .UIKeyboardDidChangeFrame, 
object: nil, 
queue: nil ) { notification in 
 // 閉包
}

RxSwift 中的訂閱操作也非常簡單,只需要調(diào)用 subscribe 方法就行了。不過與 NotificationCenter 機(jī)制不同的是,RxSwift 中每一個訂閱都是唯一的并沒有一個類似 default 這樣的全局單例對象。

更為重要的是,在沒有訂閱者的時候 Observable 對象不會發(fā)送通知。另外, Observable 對象實(shí)際上是一個序列,所以訂閱操作有點(diǎn)類似于反復(fù)調(diào)用 Swift 標(biāo)準(zhǔn)庫里中迭代器 Iterator 對象 next 函數(shù):


let sequence = 0..<3

var iterator = sequence.makeIterator()

while let n = iterator.next() { 
 print(n)
}

/* 打印結(jié)果: 
0 1 2 
*/

不過 RxSwift 訂閱操作明顯比這個來的更直接,并且可以一次實(shí)現(xiàn)對 next、error、completed 事件的的處理。一個簡單的訂閱操作示例:


let one = 1 
let two = 2 
let three = 3

let observable = Observable.of(one, two, three)

observable.subscribe { event in 
 print(event) 
}

上面代碼的訂閱操作非常簡單:打印出 observable 聲明周期內(nèi)的所有事件。正常情形下,它的結(jié)果如下:


next(1) 
next(2) 
next(3) 
completed

當(dāng)然,有時候我們可能只是需要 observable 所發(fā)射的數(shù)據(jù):


observable.subscribe { event in
 if let element = event.element { 
  print(element)
 }
}

/* 打印結(jié)果:
1 
2 
3
*/

又或者,我們需要對不同事件區(qū)別處理:


observable .subscribe(
 onNext: { element in 
  print(element) 
 },
 onCompleted: { 
  print("Completed")

 }
)

取消訂閱并消除內(nèi)存泄漏

Observable 對象只有在存在訂閱的情形下才會進(jìn)行數(shù)據(jù)發(fā)送操作,而且會在 error 或 completed 事件觸發(fā)時結(jié)束其生命周期。但是,有時候我們可能需要手動取消訂閱并提前終結(jié) Observable 對象的生命。


let observable = Observable.of("A", "B", "C")

let subscription = observable.subscribe { event in
 print(event)
}

上面代碼非常簡單這里就不再細(xì)訴了,這里我們直接來看取消訂閱的操作。其實(shí),取消訂閱的操作非常之簡單只需一行代碼:


subscription.dispose()

當(dāng)然,手動對每一個訂閱對象進(jìn)行取消操作顯然是一件枯燥的工作。所以 RxSwift 為大家提供了一個更為簡單的方案。只需在訂閱時調(diào)用 .addDisposableTo() 添加一個 DisposeBag 類型對象,我們就能在 DisposeBag 對象銷毀時取消所有綁定訂閱對象的取消動作。


let disposeBag = DisposeBag()

Observable.of("A", "B", "C")
 .subscribe { 
  3 print($0)
 } 
 .addDisposableTo(disposeBag)

這里我們之所以需要進(jìn)行 DisposeBag 對象綁定或者手動調(diào)用 dispose() 進(jìn)行取消訂閱操作,是因?yàn)槿绻贿@么做的話 Observable 對象在生命周期完結(jié)時會存在內(nèi)存泄漏的問題。

總結(jié)

本文只是簡單的介紹了 Observables 一些常見基礎(chǔ)內(nèi)容。這里還有很多更深入的內(nèi)容沒有介紹,例如:empty 和 never 類型的訂閱、使用 Create 實(shí)現(xiàn)自定義 Observable 以及 Error 類型的自定義實(shí)現(xiàn)。如果你有興趣的話,我強(qiáng)烈建議你查閱官方文檔和代碼。

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對html5模板網(wǎng)的支持。

【網(wǎng)站聲明】本站部分內(nèi)容來源于互聯(lián)網(wǎng),旨在幫助大家更快的解決問題,如果有圖片或者內(nèi)容侵犯了您的權(quán)益,請聯(lián)系我們刪除處理,感謝您的支持!

相關(guān)文檔推薦

這篇文章主要給大家介紹了關(guān)于RxSwift學(xué)習(xí)教程之類型對象Subject的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著
RxSwift是Swift函數(shù)響應(yīng)式編程的一個開源庫,由Github的ReactiveX組織開發(fā),維護(hù)。下面這篇文章主要給大家介紹了關(guān)于RxSwift學(xué)習(xí)之基礎(chǔ)篇的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需
主站蜘蛛池模板: 国产亚洲精品精品国产亚洲综合 | 欧美成人不卡 | www.蜜桃av | 自拍视频在线观看 | 91社影院在线观看 | 国产精品一区二区三区四区 | 请别相信他免费喜剧电影在线观看 | 国产精品久久久久久久久久 | 国产成人精品一区二区三区四区 | 在线 丝袜 欧美 日韩 制服 | 亚洲3p | 最新黄色在线观看 | 国产精品伦一区二区三级视频 | 高清成人av | 在线日韩av电影 | 国产一区二区三区免费观看在线 | 久久这里只有精品首页 | 欧美在线高清 | 中文字幕不卡在线观看 | 欧美三级在线 | 国产高清一区二区三区 | 亚洲精品福利视频 | 亚洲视频二区 | 伊人超碰| 中文av电影 | 欧美 日韩 国产 一区 | 精品中文字幕一区二区 | 6080yy精品一区二区三区 | 欧美日韩视频 | 亚洲九九色| 亚洲欧美在线观看 | 久草青青草 | 欧美在线国产精品 | 激情欧美一区二区三区中文字幕 | 午夜免费视频观看 | 日韩精品一区二区三区 | 色综网 | 久久不卡 | av中文字幕网 | 91精品国产综合久久久久 | 国产精品久久久久久久免费观看 |