函數(shù)式編程
- 響應(yīng)式編程(Reactive Programming,簡(jiǎn)稱(chēng) RP)
- 也是一種范式編程
- 一般與函數(shù)式融合一起,所以也叫函數(shù)響應(yīng)式編程(Functiona Reactive Programming,簡(jiǎn)稱(chēng) FRP)
ReactiveX
- 有很多種編程語(yǔ)言,如RxJava RxSwift...
- 安裝
# Podfile use_frameworks! target 'YOUR_TARGET_NAME' do pod 'RxSwift', '~> 5' pod 'RxCocoa', '~> 5' end # RxTest and RxBlocking make the most sense in the context of unit/integration tests target 'YOUR_TESTING_TARGET' do pod 'RxBlocking', '~> 5' pod 'RxTest', '~> 5' end
RxSwift 核心角色
Observable: 負(fù)責(zé)發(fā)送實(shí)踐的 (Event)
-
Observer: 負(fù)責(zé)訂閱 Observable ,監(jiān)聽(tīng) Observable 發(fā)送的事件(Event)
public enum Event<Element> { case next(Element) ` 攜帶數(shù)據(jù) ` case error(Swift.Error) `遵守 swift error 協(xié)議,后面消息不發(fā)送` case completed ` 觀(guān)察者終止行動(dòng) ` }
Observable 發(fā)布消息
- 代碼
let obs = Observable<Int>.create{ observer in observer.onNext(11) observer.onNext(22) observer.onNext(33) observer.onCompleted() `完成監(jiān)聽(tīng)` return Disposables.create() }
subscribe 監(jiān)聽(tīng)消息
- 代碼
import RxCocoa import RxSwift let bag = DisposeBag() // 回收袋 //第一種方法 obs.subscribe { event in switch event { case .next(let element): print("next", element) case .error(let error): print("error", error) case .completed: print("completed") }.disposed(by: bag) } // 第二種方法 obs.subscribe(onNext: { (element) in print("next", element) }, onError: { (error) in print("error", error) }, onCompleted: { print("completed") }) // 定時(shí)器功能 let obs = Observable<Int>.timer(.seconds(3), period: .seconds(5), scheduler: MainScheduler.instance) // 3 秒后啟動(dòng)定時(shí)器,每間隔 5 秒,在 主線(xiàn)程上發(fā)一次消息
Disposable 釋放 obs
每當(dāng) Observable 被訂閱時(shí),都會(huì)返回一個(gè) Disposable 實(shí)例,當(dāng)調(diào)用 Disposable 的 dispose , 就相當(dāng)于取消訂閱
-
在不需要再接收事件時(shí),建議取消訂閱,釋放資源,常見(jiàn)有三種取消訂閱方式
// 第一種 obs.subscribe { event in // do something }.dispose() //立即取消訂閱 // 第二種, obs.subscribe { event in // do something }.dispose(by: bag) //bag 回收袋,controller 銷(xiāo)毀, bag 銷(xiāo)毀,obs 調(diào)用取消訂閱接口 //第三種 obs .takeUntil(self.rx.deallocated) //直到 控制器調(diào)用 deallocated 方法,取消訂閱 .subscribe { event in // do something }
創(chuàng)建 Observer
-
通過(guò) AnyObserver 類(lèi)型創(chuàng)建 obs
let obs = AnyObserver<Int>.init { event in switch event { case .next(let element): print("next", element) case .error(let error): print("error", error) case .completed: print("completed") } } // 只調(diào)用一次,發(fā)送消息內(nèi)容為 5 Observable.just(5).subscribe(obs).dispose()
-
通過(guò) Observable 類(lèi)型創(chuàng)建 obs
let obs = Observable<Int>.create{ observer in observer.onNext(33) observer.onCompleted() return Disposables.create() } //監(jiān)聽(tīng) obs.subscribe(onNext: { (element) in print("next", element) }, onError: { (error) in print("error", error) }, onCompleted: { print("completed") }).disposed(by: bag) obs.subscribe { event in switch event { case .next(let element): print("next", element) case .error(let error): print("error", error) case .completed: print("completed") } }.dispose() -
通過(guò) bind 創(chuàng)建
let binder = Binder<String>(label) { label, text in label.text = text } // 監(jiān)聽(tīng) Observable.just(1).map{ "數(shù)值: \($0)" }.subscribe(binder).dispose() Observable.just(1).map{ "數(shù)值: \($0)" }.bind(to:binder).dispose()