響應式編程
- 響應式編程(Reactive Programming,簡稱RP)
- 也是一種編程範式,於1997年提出,可以簡化異步編程,提供更優雅的數據綁定
- 一般與函數式融合在一起,所以也會叫做:函數響應式編程(Functional Reactive Programming,簡稱FRP)
- 比較著名的、成熟的響應式框架
- ReactiveCocoa
- 簡稱RAC,有Objective-C、Swift版本
- 官網: http://reactivecocoa.io/
- github:https://github.com/ReactiveCocoa
- ReactiveX
- 簡稱Rx,有衆多編程語言的版本,比如RxJava、RxKotlin、RxJS、RxCpp、RxPHP、RxGo、RxSwift等等
- 官網: http://reactivex.io/
- github: https://github.com/ReactiveX
RxSwift
- RxSwift(ReactiveX for Swift),ReactiveX的Swift版本
- 源碼:https://github.com/ReactiveX/RxSwift
- 中文文檔: 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種
- next:攜帶具體數據
- error:攜帶錯誤信息,表明Observable終止,不會再發出事件
- completed:表明Observable終止
Event的底層代碼:
- 調度者
Scheduler
MainScheduler
主線程,與UI相關的任務均在該線程下執行SerialDispatchQueueScheduler
相當於GCD
對應的串行隊列ConcurrentDispatchQueueScheduler
相當於GCD
並行隊列OperationQueueScheduler
相當於NSOperationQueue
管理者可以設置併發數CurrentThreadScheduler
-當前線程
- 銷燬者
Dispose
創建、訂閱Observable(一)
Observable創建:
Observable使用subscribe訂閱:
Disposable
- 每當Observable被訂閱時,都會返回一個Disposable實例,當調用Disposable的dispose,就相當於取消訂閱
- 在不需要再接收事件時,建議取消訂閱,釋放資源。有3種常見方式取消訂閱
創建、訂閱Observable(二)
定時器創建Observable:
創建Observer
擴展Binder屬性
傳統的狀態監聽
- 在開發中經常要對各種狀態進行監聽,傳統的常見監聽方案有
- KVO
- Target-Action (...addTarget...)
- Notification
- 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的方法都會失效。