Swift學習:響應式編程RxSwift

響應式編程

  • 響應式編程(Reactive Programming,簡稱RP)
  1. 也是一種編程範式,於1997年提出,可以簡化異步編程,提供更優雅的數據綁定 
  2. 一般與函數式融合在一起,所以也會叫做:函數響應式編程(Functional Reactive Programming,簡稱FRP)
  • 比較著名的、成熟的響應式框架
  • ReactiveCocoa
  1. 簡稱RAC,有Objective-C、Swift版本
  2. 官網: http://reactivecocoa.io/
  3. github:https://github.com/ReactiveCocoa
  • ReactiveX
  1. 簡稱Rx,有衆多編程語言的版本,比如RxJava、RxKotlin、RxJS、RxCpp、RxPHP、RxGo、RxSwift等等 
  2. 官網: http://reactivex.io/
  3. github: https://github.com/ReactiveX

RxSwift

  • RxSwift(ReactiveX for Swift),ReactiveX的Swift版本
  1. 源碼:https://github.com/ReactiveX/RxSwift
  2. 中文文檔: https://beeth0ven.github.io/RxSwift-Chinese-Documentation/
  • RxSwift的github上已經有詳細的安裝教程,這裏只演示CocoaPods方式的安裝

  • RxSwift:Rx標準API的Swift實現,不包括任何iOS相關的內容 
  • RxCocoa:基於RxSwift,給iOS UI控件擴展了很多Rx特性

RxSwift的核心角色

  •  Observable:負責發送事件(Event)
  • Observer:負責訂閱Observable,監聽Observable發送的事件(Event)
  • 圖解:

 

  • Event有3種
  1. next:攜帶具體數據
  2. error:攜帶錯誤信息,表明Observable終止,不會再發出事件 
  3. completed:表明Observable終止

Event的底層代碼:

  • 調度者 Scheduler
  1. MainScheduler主線程,與UI相關的任務均在該線程下執行
  2. SerialDispatchQueueScheduler相當於GCD對應的串行隊列
  3. ConcurrentDispatchQueueScheduler相當於GCD並行隊列
  4. OperationQueueScheduler相當於NSOperationQueue管理者可以設置併發數
  5. CurrentThreadScheduler-當前線程
  • 銷燬者 Dispose

創建、訂閱Observable(一)

 Observable創建:

Observable使用subscribe訂閱:


Disposable

  • 每當Observable被訂閱時,都會返回一個Disposable實例,當調用Disposable的dispose,就相當於取消訂閱 
  • 在不需要再接收事件時,建議取消訂閱,釋放資源。有3種常見方式取消訂閱

 

 


創建、訂閱Observable(二)

定時器創建Observable:


創建Observer


擴展Binder屬性


傳統的狀態監聽

  • 在開發中經常要對各種狀態進行監聽,傳統的常見監聽方案有
  1. KVO
  2. Target-Action (...addTarget...)
  3. Notification
  4. DelegatepBlock Callback
  • 傳統方案經常會出現錯綜複雜的依賴關係、耦合性較高,還需要編寫重複的非業務代碼

RxSwift的狀態監聽

按鈕點擊的監聽:

button.rx.controlEvent(.touchUpInside).subscribe(onNext: {
            print("按鈕被點擊了")
        }).disposed(by:bag)

下面的方法實現效果與上面的一致:

屬性監聽:


既是Observable,又是Observer

  • 諸如UISlider.rx.value、UTextField.rx.text這類屬性值,既是Observable,又是Observer 
  • 它們是RxCocoa.ControlProperty類型

RxSwift的tableView的應用

注意:如果設置了tableView的delegate,RxSwift所設置的上面的tableview的rx的方法都會失效。

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章