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

RxSwift學習教程之基礎篇

RxSwift是Swift函數響應式編程的一個開源庫,由Github的ReactiveX組織開發,維護。下面這篇文章主要給大家介紹了關于RxSwift學習之基礎篇的相關資料,文中通過示例代碼介紹的非常詳細,需

前言

我們在 iOS 開發過程中,幾乎無時無刻都要面對異步事件的處理。例如,按鍵點擊、數據保存、、音頻后臺播放、交互動畫展示。這些事件并不具備特定時序性,甚至它們可能同時發生。

雖然 Apple 提供了通知、代理、GCD、閉包等異步機制,但是這些機制缺乏一個統一的抽象表述。另外,這些機制在處理共享的可變數據或狀態時不夠清晰簡練。當然,這并不是說編寫優雅的異步代碼不現實。畢竟與其他平臺相比 iOS 的異步機制還是很強大的。

幸運的是,我們能夠通過 RxSwift 優雅的處理異步代碼。

至于 RxSwift 的優勢以及為什么要使用它,詳見文檔。這里就不廢話了。

RxSwift 簡介

其實響應式編程并不是一個什么新的概念,只不過是最近幾年受到了開發者更多的關注。它最早由巨硬提出,主要的目的是為了應對復雜的 UI 異步事件和應用實時響應。社區中也已經有了各種語言版本的響應式編程實現,包括:RxJS、RxKotlin、Rx.NET、RxScala、RxSwift。這些類庫僅僅只是實現方式存在差異,所以開發者在討論應用邏輯時不會存在溝通障礙。

RxSwift 作為 Swift 語言的響應式編程實現,它在傳統的命令式編程和純函數式編程中找到了一個很好的平衡點。通過使用不可變代碼定義異步處理輸入,RxSwift 以一種確定可組合的形式對事件做出響應。

總的來說,RxSwift 有三個主要構成部分:Observable、Operator、Scheduler 。下面我們就來一一介紹。

Observable

Observable<T> 類可以說是 RxSwift 整個框架的基石。它能異步的觸發一系列事件流并攜帶不可更改的狀態變量。簡單來說就是:它能讓某個類的實例在一段時間內實現對另一個實例對象值的觀察。例如:觀察者可以捕獲對所有可觀察對象觸發的事件,從而實現 UI 的實時更新或者是數據的實時處理。

其中 Observable<T> 類遵循了 ObservableType 協議。另外,Observable 對象所能觸發的事件只有以下三種:

  • next 事件:該事件在觸發時會將可觀察對象的最新值傳遞給觀察者。
  • completed 事件:該事件意味著可觀察對象的生命周期正常結束不會在繼續觸發事件。
  • error 事件:該事件表明可觀察對象出現了錯誤導致生命周期異常終止。

對于一個可觀察的整型變量來說,異步環境下它所觸發的事件可以在時間線上被描繪成這樣一個事件序列:

另外,我們可以對這三類事件進行組合從而實現更為復雜的業務邏輯。與此同時,我們還可以使用該機制輕松實現代碼解耦和多個對象間數據傳遞,無需編寫代理或者閉包代碼。

這里,我們還有一點值得注意。那就是可觀察序列其實有兩種類型。

有限觀察序列( Finite observable sequences )

該序列是指那些最后會以 completed 或者 error 事件終極生命周期的可觀察對象。最典型的例子就是,通過 API 進行網絡請求:

  • 開始數據請求并準備進行數據接收。
  • 接收到服務端響應開始接收數據。
  • 如果服務器或者網絡發生故障則關閉請求并觸發錯誤處理。
  • 如果一切正常則對請求數據進行處理和分析。

下面是一個文件下載請求的 Rx 范式的代碼:


API.download(file: "http://www...")
 .subscribe( onNext: { data in
      append data to temporary file }, 
    onError: { error in
      display error to user }, 
    onCompleted: {
      use downloaded file })

這段代碼中 API.download (file:) 函數會創建一個 Observable<Data> 實例對象,并且在整個數據接收過程中會不斷的觸發 next 事件。然后,我們在 next 事件中會將這些片段數據保存到臨時文件中。如果此過程出現錯誤的話,我們會將錯誤信息展示給用戶。如果一切順利我們會將臨時文件保存到設備中。最后在下載完成后,我們可以在 completed 進行下一步的邏輯處理。

無限觀察序列( Infinite observable sequences )

與網絡任務不同的是,UI 以及交互事件是無限觀察序列。它們并不存在一個明確的生命周期終結點。例如,針對可能的設備方向旋轉,我們需要實時進行布局修改。而設備的方向旋轉本身是隨機發生的并且與應用本身具有同樣的生命周期。因此 Rx 也需要一種機制支持這種無限觀察序列。

針對這種情況,在 RxSwift 中我們可以通過以下代碼來應對:


UIDevice.rx.orientation.subscribe(onNext: { current in 
 switch current { 
  case .landscape:
   re-arrange UI for landscape 
  case .portrait:
   re-arrange UI for portrait 
 } 
})

操作符

ObservableType 以及 Observable 類的實現中都包含大量的異步處理方法,這些方法也被稱為操作符。由于這些操作符只是進行異步輸入處理并產生對應輸出,所以它并不會對應用產生多余的副作用。另外,因為操作符之間的高度解耦所以我們很容易對它進行組合以期實現復雜的功能。

例如,對于上面的設備方向旋轉,我們可以對所有的情況進行過濾然后對部分值進行進一步處理。


UIDevice.rx.orientation
 .filter { value in
  return value != .landscape 
 } 
 .map { _ in
  return "Portrait is the best!" 
 } 
 .subscribe( onNext: { string in 
  showAlert(text: string) 
 })

上面的代碼中,我們首先會將所有 .landscape 方向過濾掉不做任何處理。然后,我們再將剩下的 portrait 轉化為字符串 Portrait is the best! 。整個處理流程大致如下:

這種函數式的操作符讓我們可以靈活的組合出更強大的功能。

Scheduler

Schedulers 是一個與 GCD 相對應的概念,只不過前者使用起來更為方便。RxSwift 中預定義的 Schedulers 足夠開發者應對絕大多數的編程場景。

例如,我們可以使用串型序列 SerialDispatchQueueScheduler 來處理 next 事件,通過 ConcurrentDispatchQueueScheduler 運行并行文件下載任務,通過 OperationQueueScheduler 運行一個 NSOperationQueue 操作隊列。甚至你可以在同一個觀察對象的不同任務中使用不同的 Schedulers 類型,如下圖:

我們將左側的任務用不同的顏色加以區分,然后在右側任務被拆分為不同的步驟并且放在不同 Schedulers 中。例如,network subscription 任務就被拆分為三個步驟并依次放入了 Custom NSOperation Scheduler 、Background Concurrent Scheduler、Main Thred Serial Scheduler 。

補充

值得注意的是, RxSwift 并沒有對客戶端的應用架構作出硬性規定。這意味著,我們可以在已有項目中引入 RxSwift 進行響應式編程實踐。當然已有框架中必定存在一個最適合 RxSwift 的,而它就是 MVVM。因為在 MVVM 中我們可以將 VM 中的部分屬性直接與 UI 進行綁定。

另外,對于 iOS 編程來說僅僅有 RxSwift 是遠遠不夠的。RxSwift 只是 Swift 語言的響應式實現,我們還需要一種 Cocoa 層面的實現。好在這里存在 RxCocoa 作為 UIKit 的響應式補充。前面設備方向代碼 UIDevice.rx.orientation 就是 RxCocoa 的應用 。

總結

作為系列開篇,本文介紹了 RxSwift 的一些基本理念和構成,更多相關的內容將會在后面帶來。

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

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

相關文檔推薦

這篇文章主要給大家介紹了關于RxSwift學習教程之類型對象Subject的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著
這篇文章主要給大家介紹了關于RxSwift學習教程之Observable的相關資料,文中詳細的給大家介紹了關于新建Observable、訂閱Observable和取消訂閱并消除內存泄漏等相關的內容,需要的朋友可以
主站蜘蛛池模板: SOUNDWELL 编码器|电位器|旋转编码器|可调电位器|编码开关厂家-广东升威电子制品有限公司 | 超声波乳化机-超声波分散机|仪-超声波萃取仪-超声波均质机-精浩机械|首页 | 深圳网站建设-高端企业网站开发-定制网页设计制作公司 | 传动滚筒_厂家-淄博海恒机械制造厂 | 合肥注册公司|合肥代办营业执照、2024注册公司流程 | 定制奶茶纸杯_定制豆浆杯_广东纸杯厂_[绿保佳]一家专业生产纸杯碗的厂家 | 环压强度试验机-拉链拉力试验机-上海倾技仪器仪表科技有限公司 | 购买舔盐、舔砖、矿物质盐压块机,鱼饵、鱼饲料压块机--请到杜甫机械 | 齿轮减速马达一体式_蜗轮蜗杆减速机配电机-德国BOSERL齿轮减速电动机生产厂家 | 吊篮式|移动式冷热冲击试验箱-二槽冷热冲击试验箱-广东科宝 | EFM 022静电场测试仪-套帽式风量计-静电平板监测器-上海民仪电子有限公司 | 电缆桥架生产厂家_槽式/梯式_热镀锌线槽_广东东莞雷正电气 | 高压包-点火器-高压发生器-点火变压器-江苏天网 | 河南彩印编织袋,郑州饲料编织袋定制,肥料编织袋加工厂-盛军塑业 河南凯邦机械制造有限公司 | 东莞韩创-专业绝缘骨架|马达塑胶零件|塑胶电机配件|塑封电机骨架厂家 | 语料库-提供经典范文,文案句子,常用文书,您的写作得力助手 | 南京展台搭建-南京展会设计-南京展览设计公司-南京展厅展示设计-南京汇雅展览工程有限公司 | 浙江华锤电器有限公司_地磅称重设备_防作弊地磅_浙江地磅售后维修_无人值守扫码过磅系统_浙江源头地磅厂家_浙江工厂直营地磅 | 户外环保不锈钢垃圾桶_标识标牌制作_园林公园椅厂家_花箱定制-北京汇众环艺 | 铝合金重力铸造_铝合金翻砂铸造_铝铸件厂家-东莞市铝得旺五金制品有限公司 | 专注提供国外机电设备及配件-工业控制领域一站式服务商-深圳市华联欧国际贸易有限公司 | PC阳光板-PC耐力板-阳光板雨棚-耐力板雨棚,厂家定制[优尼科板材] | 固诺家居-全屋定制十大品牌_整体衣柜木门橱柜招商加盟 | 整车VOC采样环境舱-甲醛VOC预处理舱-多舱法VOC检测环境仓-上海科绿特科技仪器有限公司 | 掺铥光纤放大器-C/L波段光纤放大器-小信号光纤放大器-合肥脉锐光电技术有限公司 | 膏剂灌装旋盖机-眼药水灌装生产线-西林瓶粉剂分装机-南通博琅机械科技 | 福尔卡(北京)新型材料技术股份有限公司 | 塑料检查井_双扣聚氯乙烯增强管_双壁波纹管-河南中盈塑料制品有限公司 | 【电子厂招聘_普工招工网_工厂招聘信息平台】-工立方打工网 | 阳光1号桔柚_无核沃柑_柑橘新品种枝条苗木批发 - 苧金网 | 化妆品加工厂-化妆品加工-化妆品代加工-面膜加工-广东欧泉生化科技有限公司 | 安徽千住锡膏_安徽阿尔法锡膏锡条_安徽唯特偶锡膏_卡夫特胶水-芜湖荣亮电子科技有限公司 | 郑州爱婴幼师学校_专业幼师培训_托育师培训_幼儿教育培训学校 | 置顶式搅拌器-优莱博化学防爆冰箱-磁驱搅拌器-天津市布鲁克科技有限公司 | 混合气体腐蚀试验箱_盐雾/硫化氢/气体腐蚀试验箱厂家-北京中科博达 | 大连海岛旅游网>>大连旅游,大连海岛游,旅游景点攻略,海岛旅游官网 | 合肥弱电工程_安徽安防工程_智能化工程公司-合肥雷润 | 生物颗粒燃烧机-生物质燃烧机-热风炉-生物颗粒蒸汽发生器-丽水市久凯能源设备有限公司 | 培训无忧网-教育培训咨询招生第三方平台 | 深圳市东信高科自动化设备有限公司 | 智能化的检漏仪_气密性测试仪_流量测试仪_流阻阻力测试仪_呼吸管快速检漏仪_连接器防水测试仪_车载镜头测试仪_奥图自动化科技 |