編程思想
- Swift 是一門靜態(tài)語言
- RxSwift 響應(yīng)式編程思想
RxSwift 學(xué)習(xí)的必要性
- 復(fù)合
- 復(fù)用
- 清晰
- 易用
- 穩(wěn)定
函數(shù)式編程
- 使用函數(shù)做為參數(shù)
- 源于數(shù)學(xué)的 y = f(x) -> x = f(x) -> y = f(f(x))
簡單使用
KVO
// var
@objc dynamic var name: String = ""
var disposeBag = DisposeBag()
rx.observeWeakly(String.self, "name")
.debug()
.subscribe()
.disposed(by: disposeBag)
// print
-> subscribed
-> Event next(Optional(""))
Button 直接監(jiān)聽
button.rx.tap
.debug()
.subscribe()
.disposed(by: disposeBag)
// rx.tap 默認(rèn)調(diào)用的 .touchUpInside 事件
button.rx.controlEvent(.touchUpInside)
.debug()
.subscribe()
.disposed(by: disposeBag)
TextFiled 的輸入監(jiān)聽
// 獲取輸入的Text
textFiled.rx.text.orEmpty
.debug()
.subscribe()
.disposed(by: disposeBag)
// text 實(shí)時(shí)綁定到 button 的 title 上
textFiled.rx.text.orEmpty
.bind(to: button.rx.title())
.disposed(by: disposeBag)
ScrollView
// 獲取滾動的位置
scrollView.rx.contentOffset
.debug()
.subscribe()
.disposed(by: disposeBag)
通知
NotificationCenter.default.rx.notification(UIApplication.willEnterForegroundNotification)
.debug()
.subscribe()
.disposed(by: disposeBag)
定時(shí)器 Time(底層實(shí)現(xiàn)原理封裝了GCD的Timer)
Observable<Int>.interval(1, scheduler: MainScheduler.instance)
.debug()
.subscribe()
.disposed(by: disposeBag)
// 底層實(shí)現(xiàn)的是一樣的
Observable<Int>.timer(1, scheduler: MainScheduler.instance)
URLSession 網(wǎng)絡(luò)請求
URLSession.shared.rx.response(request: URLRequest(url: URL(string: "www.baidu.com")!))
.debug()
.subscribe()
.disposed(by: disposeBag)
萬物皆 Rx
- 實(shí)現(xiàn)
ReactiveCompatible
協(xié)議
public protocol ReactiveCompatible {
/// Extended type
associatedtype ReactiveBase
@available(*, deprecated, message: "Use `ReactiveBase` instead.")
typealias CompatibleType = ReactiveBase
/// Reactive extensions.
static var rx: Reactive<ReactiveBase>.Type { get set }
/// Reactive extensions.
var rx: Reactive<ReactiveBase> { get set }
}
// NSObject 的子類都有 Rx
extension NSObject: ReactiveCompatible { }
序列
- 創(chuàng)建序列
- 訂閱信號
- 發(fā)送信號 (onNext, onError, onCompleted)
創(chuàng)建序列
let ob = Observable<Any>.create { (observer) -> Disposable in
observer.onNext("next event")
observer.onCompleted()
return Disposables.create {
}
}
_ = ob.debug().subscribe()
有窮序列
// 可觀察序列 - Sequence
// 無限 -> 無窮序列 timer interval
// 有窮序列 -> Array.sequence
let arr = [1,2,3,4,5]
Observable.just(arr)
.debug()
.subscribe()
.disposed(by: disposeBag)
// print: [1, 2, 3]
Observable.from(arr)
.debug()
.subscribe()
.disposed(by: disposeBag)
// print : 1 2 3 4 5
序列創(chuàng)建流程
- 創(chuàng)建序列 ->
Observable.create
->AnonymousObservable
匿名類部類保存閉包(函數(shù)式保存_subscribeHandler
)-> producer.subscribe -> run - 訂閱信號 ->
AnonymousObserver
創(chuàng)建一個觀察者(通過尾隨閉包創(chuàng)建) -> 保存了EventHandler
事件
// 創(chuàng)建序列
let ob = Observable<Any>.create {}
-> Create.swift: AnonymousObservable() // 匿名類部類保存 閉包
-> _subscribeHandler
// 訂閱
_ = ob.subscribe(onNext: { _ in
}, onError: { _ in
}, onCompleted: {
}) {
}
subscribe{} 實(shí)現(xiàn)
let observer = AnonymousObserver<Element> { } 創(chuàng)建訂閱者郎哭,尾隨閉包
-> self.asObservable().subscribe(observer)
-> Producer. subscribe
-> AnonymousObservable.run
-> AnonymousObservableSink.run -> _subscribeHandler 發(fā)送 event 事件