亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Swift > 正文

RxSwift學習之Observable的新建、訂閱及取消訂閱

2020-03-09 17:44:23
字體:
來源:轉載
供稿:網友

前言

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

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

rxswift,observable,教程,swift

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

Observable 生命周期

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

completed 所表示的正常終結:

rxswift,observable,教程,swift

error 所表示的異常終結:

rxswift,observable,教程,swift

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

/// 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 事件會攜帶一個實例進行傳播,error 事件會攜帶一個 Error 實例,completed 則什么都不會攜帶。

新建 Observable

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

// 1let one = 1 let two = 2 let three = 3// 2 let observable: Observable<Int> = Observable<Int>.just(one)

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

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

可能上面的代碼會給人一種誤導,讓人覺得 observable2 中的數據可能是一個數組類型。不過好在我們可以通過下面的代碼進行檢驗:

observable2.subscribe(onNext: { element in  print(element)  }) /* 打印結果:123*/

而真正創建數組類型變量的方法是:

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

上面只是幾個常用的 Observable 創建方法,更多的內容可以去查文檔和代碼。

訂閱 Observable

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

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

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

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

let sequence = 0..<3var iterator = sequence.makeIterator()while let n = iterator.next() {  print(n)}/* 打印結果: 0 1 2 */

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

let one = 1 let two = 2 let three = 3let observable = Observable.of(one, two, three)observable.subscribe { event in  print(event) }

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

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

當然,有時候我們可能只是需要 observable 所發射的數據:

observable.subscribe { event in if let element = event.element {   print(element) }}/* 打印結果:1 2 3*/

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

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

取消訂閱并消除內存泄漏

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

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

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

subscription.dispose()

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

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

這里我們之所以需要進行 DisposeBag 對象綁定或者手動調用 dispose() 進行取消訂閱操作,是因為如果不這么做的話 Observable 對象在生命周期完結時會存在內存泄漏的問題。

總結

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

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到swift教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久精品国产亚洲| 国产欧美精品久久久| 国产精品电影在线观看| www.xxxx精品| 亚洲片国产一区一级在线观看| 色综合老司机第九色激情| 国产一区视频在线播放| 最近的2019中文字幕免费一页| 国产欧美va欧美va香蕉在线| 国产精品扒开腿做爽爽爽男男| 亚洲综合第一页| 伊人久久久久久久久久| 日韩亚洲国产中文字幕| 最近2019免费中文字幕视频三| 亚洲在线免费看| 日韩中文字幕网| 永久免费精品影视网站| 国产精品永久免费视频| 久久69精品久久久久久国产越南| 777午夜精品福利在线观看| 欧美日韩中文字幕综合视频| 国产精品视频精品视频| 中文字幕v亚洲ⅴv天堂| 亚洲国产日韩欧美在线动漫| 黄网站色欧美视频| 国产精品视频免费在线| 国产精品久久久久久久久借妻| 国内精品久久久| 日韩精品视频免费| 日韩一区二区av| 亚洲第一福利网站| 岛国av一区二区在线在线观看| 国产aaa精品| 亚洲人成电影网站色xx| 欧美一区二区大胆人体摄影专业网站| 欧美性一区二区三区| 欧洲成人在线观看| 国产精品扒开腿做爽爽爽的视频| 欧亚精品在线观看| 日韩免费黄色av| 亚洲在线一区二区| 在线电影欧美日韩一区二区私密| 亚洲国产成人精品女人久久久| 精品久久久久久久久久久久| 91sa在线看| 精品久久久免费| 成人黄色影片在线| 国产91对白在线播放| 一区二区在线视频播放| 不卡毛片在线看| 不卡在线观看电视剧完整版| 911国产网站尤物在线观看| 国产精品丝袜高跟| 色爱av美腿丝袜综合粉嫩av| 亚洲全黄一级网站| 亚洲无av在线中文字幕| 国产视频久久网| 国产精品三级在线| 国产亚洲精品久久久久久牛牛| 91精品国产电影| 午夜精品久久久久久久久久久久久| 亚洲黄色av女优在线观看| 成人免费午夜电影| 国产精品免费一区| 九九热精品视频国产| 在线日韩中文字幕| 中文字幕在线看视频国产欧美在线看完整| 久久久精品在线观看| 欧美日本精品在线| 日韩欧美在线视频观看| 97高清免费视频| 91成人天堂久久成人| 96精品久久久久中文字幕| 国产免费亚洲高清| 日韩av123| 久久视频免费观看| 国产精品欧美在线| 日韩精品在线视频观看| 久久久国产一区| 日韩精品高清在线观看| 久久国产加勒比精品无码| 主播福利视频一区| 久久精品99久久久久久久久| 欧美精品免费在线观看| 亚洲精品中文字幕有码专区| 亚洲欧美另类中文字幕| 亚洲va欧美va国产综合久久| 久久久久久成人精品| 97在线视频观看| 精品久久中文字幕久久av| 91成人国产在线观看| 国产在线精品一区免费香蕉| 亚洲国产高清自拍| 国产精品男女猛烈高潮激情| 亚洲激情久久久| 久久久久久久久久婷婷| 国产一区av在线| 91在线视频九色| 午夜精品一区二区三区在线| 超碰97人人做人人爱少妇| 日本精品va在线观看| 国产盗摄xxxx视频xxx69| 亚洲欧美日韩一区二区在线| 精品国产视频在线| 亚洲午夜女主播在线直播| 国产一区二区三区中文| 国产+人+亚洲| 九九精品在线播放| 亚洲女性裸体视频| 国产精品99蜜臀久久不卡二区| 91精品国产网站| 亚洲人a成www在线影院| 一区三区二区视频| 正在播放欧美一区| 久久久久久香蕉网| 中文字幕在线国产精品| 欧美激情亚洲另类| 97久久超碰福利国产精品…| 精品欧美国产一区二区三区| 国产一区二区在线免费视频| 国产精品美女久久久免费| 91色中文字幕| 亚洲精品狠狠操| 国产91色在线|| 欧美精品aaa| 亚洲精品欧美日韩| 97av在线视频免费播放| 亚洲视频专区在线| 欧美精品18videosex性欧美| 日韩电影中文字幕在线| 免费av在线一区| 2018日韩中文字幕| 国产一区二区成人| 精品人伦一区二区三区蜜桃免费| 91在线看www| 国产精品国产亚洲伊人久久| 亚洲最大福利视频| 国产在线拍揄自揄视频不卡99| 亚洲高清一区二| 96pao国产成视频永久免费| 久久久精品国产亚洲| 91精品在线国产| 中文字幕精品久久| 91在线观看免费网站| 性欧美xxxx交| 欧美性猛交xxxx乱大交蜜桃| 欧美性少妇18aaaa视频| 亚洲自拍高清视频网站| 中文字幕精品久久| 久久影院免费观看| 91综合免费在线| 在线观看亚洲视频| 亚洲午夜久久久影院| 国产脚交av在线一区二区| 97国产精品免费视频| 少妇精69xxtheporn| 国产一区视频在线| 日韩欧美黄色动漫| 亚洲精品美女在线观看| 国产成人综合精品在线| 欧美性理论片在线观看片免费| 欧美性生交大片免费| 日韩一区二区福利| 国产精品成人v|