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

首頁 > 編程 > Swift > 正文

RxSwift學習教程之基礎篇

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

前言

我們在 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 事件:該事件表明可觀察對象出現了錯誤導致生命周期異常終止。

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

rxswift,rxswift是什么,rxswift教程

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

rxswift,rxswift是什么,rxswift教程

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

有限觀察序列( 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! 。整個處理流程大致如下:

rxswift,rxswift是什么,rxswift教程

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

Scheduler

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

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

rxswift,rxswift是什么,rxswift教程

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

補充

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

rxswift,rxswift是什么,rxswift教程

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

總結

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

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


注:相關教程知識閱讀請移步到swift教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品视频在线观看视频| 日韩av网址在线| 全亚洲最色的网站在线观看| 一本色道久久88精品综合| 亚洲欧美成人在线| 91亚洲人电影| 久久久亚洲精选| 国产精品91久久| 欧美日韩精品国产| www.久久久久久.com| 亚洲国产97在线精品一区| 成人在线中文字幕| 啪一啪鲁一鲁2019在线视频| 国产精品一区二区三区久久久| 91精品国产高清久久久久久| 国产精品旅馆在线| 成人欧美一区二区三区在线| 久久久久国产精品免费网站| 国产精品一香蕉国产线看观看| 国产精品久久久久久搜索| 欧美丰满老妇厨房牲生活| 国产一区二区欧美日韩| 久久久久久久成人| 日韩欧美在线观看| 国自产精品手机在线观看视频| 91免费福利视频| 91欧美视频网站| 97视频在线观看视频免费视频| 国产视频福利一区| 国产精品一香蕉国产线看观看| 日日狠狠久久偷偷四色综合免费| 久久久999国产| 日韩av网站大全| 岛国视频午夜一区免费在线观看| 国产精品老女人视频| 国自在线精品视频| 91在线视频免费| 欧洲一区二区视频| 国产精品日韩在线| 亚洲网站在线看| 欧美精品videossex88| 欧美性感美女h网站在线观看免费| 久久久久久久久国产精品| 亚洲精品乱码久久久久久按摩观| 亚洲欧美在线第一页| 欧美成人免费观看| www高清在线视频日韩欧美| 欧美性猛交xxxx免费看久久久| 精品亚洲一区二区三区四区五区| 欧美www视频在线观看| 国产精品揄拍一区二区| 性欧美办公室18xxxxhd| 日韩av不卡在线| 色噜噜亚洲精品中文字幕| 精品久久久久久久大神国产| 亚洲国产精品成人va在线观看| 中文字幕日韩精品在线观看| 亚洲丝袜一区在线| 97久久伊人激情网| 色哟哟入口国产精品| 欧美精品亚州精品| 亚洲精品国产精品国产自| 红桃视频成人在线观看| 欧美日韩成人在线视频| 日本视频久久久| 亚洲性生活视频在线观看| 日韩极品精品视频免费观看| 久久视频在线播放| 91精品国产综合久久香蕉922| 欧美久久精品午夜青青大伊人| 中文字幕日韩欧美在线视频| 亚洲成人av中文字幕| 色综合视频一区中文字幕| 亚洲淫片在线视频| 伊人伊成久久人综合网小说| 成人欧美在线视频| 日韩一区二区三区在线播放| 亚洲人成欧美中文字幕| 日韩有码视频在线| 国产成人高潮免费观看精品| 欧美精品一区二区免费| x99av成人免费| 亚洲午夜激情免费视频| 欧美老女人xx| 一本色道久久综合亚洲精品小说| 不卡在线观看电视剧完整版| 91精品免费看| 日本一区二区在线免费播放| 97国产真实伦对白精彩视频8| 午夜精品99久久免费| 日韩av在线电影网| 在线看日韩av| 2023亚洲男人天堂| 欧美成人性色生活仑片| 国产精品久久久久久一区二区| 在线激情影院一区| 久久韩国免费视频| 91精品国产自产在线观看永久| 福利视频第一区| 亚洲一区制服诱惑| 欧美激情久久久久久| 成人动漫网站在线观看| 国产一区二区丝袜高跟鞋图片| 国产日产欧美a一级在线| 91亚洲精品一区二区| 最近2019中文字幕mv免费看| 亚洲一区二区中文字幕| 亚洲天堂网站在线观看视频| 亚洲男人天堂2023| 国内精品久久久久久影视8| 富二代精品短视频| 亚洲一区二区自拍| 成人午夜在线视频一区| 欧美色视频日本高清在线观看| 欧美野外猛男的大粗鳮| 国产剧情日韩欧美| 亚洲天堂男人天堂女人天堂| 色香阁99久久精品久久久| 亚洲精品有码在线| 538国产精品一区二区免费视频| 欧美激情视频免费观看| 亚洲毛片在线看| 久久男人av资源网站| 亚洲人成欧美中文字幕| 91精品国产成人www| 久久偷看各类女兵18女厕嘘嘘| 色综合久综合久久综合久鬼88| 亚洲一区二区三区视频播放| 国产国产精品人在线视| 亚洲男子天堂网| 欧美国产第一页| 欧美极品少妇全裸体| 俺也去精品视频在线观看| 久久久www成人免费精品| 亚洲www在线观看| 亚洲综合最新在线| 久久久99免费视频| 亚洲在线视频福利| 三级精品视频久久久久| 国外成人在线视频| 欧美国产精品va在线观看| 成人97在线观看视频| 亚洲人午夜精品| 欧美丰满少妇xxxxx做受| 亚洲aⅴ日韩av电影在线观看| 国产欧美一区二区三区久久人妖| 69av成年福利视频| www.美女亚洲精品| 欧美中文在线观看国产| 国产视频精品久久久| 国产精品久久一区主播| 国产伦精品免费视频| 久久av在线看| 亚洲欧洲在线看| 91sa在线看| 日韩视频在线一区| 国产成人av网址| 在线看欧美日韩| 尤物yw午夜国产精品视频明星| 成人亚洲综合色就1024| 国产精品女人久久久久久| 国产99久久精品一区二区 夜夜躁日日躁| 亚洲国产高清高潮精品美女| 日韩美女视频在线观看|