pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

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

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

前言

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

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

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

Observable 生命周期

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

completed 所表示的正常終結:

error 所表示的異常終結:

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


/// 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 :


// 1
let 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) 
 })
 
/* 打印結果:
1
2
3
*/

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


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..<3

var 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 = 3

let 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 類型的自定義實現。如果你有興趣的話,我強烈建議你查閱官方文檔和代碼。

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

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

相關文檔推薦

這篇文章主要給大家介紹了關于RxSwift學習教程之類型對象Subject的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著
RxSwift是Swift函數響應式編程的一個開源庫,由Github的ReactiveX組織開發,維護。下面這篇文章主要給大家介紹了關于RxSwift學習之基礎篇的相關資料,文中通過示例代碼介紹的非常詳細,需
主站蜘蛛池模板: 不锈钢搅拌罐_高速搅拌罐厂家-无锡市凡格德化工装备科技有限公司 | IP检测-检测您的IP质量| 西安标准厂房_陕西工业厂房_西咸新区独栋厂房_长信科技产业园官方网站 | 工业冷却塔维修厂家_方形不锈钢工业凉水塔维修改造方案-广东康明节能空调有限公司 | 双效节能浓缩器-热回流提取浓缩机组-温州市利宏机械 | 芝麻黑-芝麻黑石材厂家-永峰石业| 活性氧化铝球|氧化铝干燥剂|分子筛干燥剂|氢氧化铝粉-淄博同心材料有限公司 | 依维柯自动挡房车,自行式国产改装房车,小型房车价格,中国十大房车品牌_南京拓锐斯特房车 - 南京拓锐斯特房车 | 深圳市简易检测技术有限公司| 气弹簧定制-气动杆-可控气弹簧-不锈钢阻尼器-工业气弹簧-可调节气弹簧厂家-常州巨腾气弹簧供应商 | 脉冲布袋除尘器_除尘布袋-泊头市净化除尘设备生产厂家 | 仓储笼_仓储货架_南京货架_仓储货架厂家_南京货架价格低-南京一品仓储设备制造公司 | 温湿度记录纸_圆盘_横河记录纸|霍尼韦尔记录仪-广州汤米斯机电设备有限公司 | 上海电子秤厂家,电子秤厂家价格,上海吊秤厂家,吊秤供应价格-上海佳宜电子科技有限公司 | 干式变压器厂_干式变压器厂家_scb11/scb13/scb10/scb14/scb18干式变压器生产厂家-山东科锐变压器有限公司 | 全自动贴标机-套标机-工业热风机-不干胶贴标机-上海厚冉机械 | PC阳光板-PC耐力板-阳光板雨棚-耐力板雨棚,厂家定制[优尼科板材] | 武汉刮刮奖_刮刮卡印刷厂_为企业提供门票印刷_武汉合格证印刷_现金劵代金券印刷制作 - 武汉泽雅印刷有限公司 | 水平垂直燃烧试验仪-灼热丝试验仪-漏电起痕试验仪-针焰试验仪-塑料材料燃烧检测设备-IP防水试验机 | 10吨无线拉力计-2吨拉力计价格-上海佳宜电子科技有限公司 | 集装箱展厅-住人集装箱住宿|建筑|房屋|集装箱售楼处-山东锐嘉科技工程有限公司 | 合肥仿石砖_合肥pc砖厂家_合肥PC仿石砖_安徽旭坤建材有限公司 | 方源木业官网-四川木门-全国木门专业品牌| 世纪豪门官网 世纪豪门集成吊顶加盟电话 世纪豪门售后电话 | 天津热油泵_管道泵_天津高温热油泵-天津市金丰泰机械泵业有限公司【官方网站】 | 鄂泉泵业官网|(杭州、上海、全国畅销)大流量防汛排涝泵-LW立式排污泵 | 展厅设计-展馆设计-专业企业展厅展馆设计公司-昆明华文创意 | 打包箱房_集成房屋-山东佳一集成房屋有限公司 | 集装箱标准养护室-集装箱移动式养护室-广州璟业试验仪器有限公司 | 干粉砂浆设备-干粉砂浆生产线-干混-石膏-保温砂浆设备生产线-腻子粉设备厂家-国恒机械 | 铝箔袋,铝箔袋厂家,东莞铝箔袋,防静电铝箔袋,防静电屏蔽袋,防静电真空袋,真空袋-东莞铭晋让您的产品与众不同 | 磨煤机配件-高铬辊套-高铬衬板-立磨辊套-盐山县宏润电力设备有限公司 | SDG吸附剂,SDG酸气吸附剂,干式酸性气体吸收剂生产厂家,超过20年生产使用经验。 - 富莱尔环保设备公司(原名天津市武清县环保设备厂) | 多功能真空滤油机_润滑油全自动滤油机_高效真空滤油机价格-重庆润华通驰 | ◆大型吹塑加工|吹塑加工|吹塑代加工|吹塑加工厂|吹塑设备|滚塑加工|滚塑代加工-莱力奇塑业有限公司 | 青岛成人高考_山东成考报名网| 河南凯邦机械制造有限公司 | 浙江华锤电器有限公司_地磅称重设备_防作弊地磅_浙江地磅售后维修_无人值守扫码过磅系统_浙江源头地磅厂家_浙江工厂直营地磅 | 礼仪庆典公司,礼仪策划公司,庆典公司,演出公司,演艺公司,年会酒会,生日寿宴,动工仪式,开工仪式,奠基典礼,商务会议,竣工落成,乔迁揭牌,签约启动-东莞市开门红文化传媒有限公司 | 磁力去毛刺机_去毛刺磁力抛光机_磁力光饰机_磁力滚抛机_精密金属零件去毛刺机厂家-冠古科技 | 湖州织里童装_女童男童中大童装_款式多尺码全_织里儿童网【官网】-嘉兴嘉乐网络科技有限公司 |