编程思想
- Swift 是一门静态语言
- RxSwift 响应式编程思想
RxSwift 学习的必要性
- 复合
- 复用
- 清晰
- 易用
- 稳定
函数式编程
- 使用函数做为参数
- 源于数学的 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 直接监听
button.rx.tap
.debug()
.subscribe()
.disposed(by: disposeBag)
// rx.tap 默认调用的 .touchUpInside 事件
button.rx.controlEvent(.touchUpInside)
.debug()
.subscribe()
.disposed(by: disposeBag)
TextFiled 的输入监听
// 获取输入的Text
textFiled.rx.text.orEmpty
.debug()
.subscribe()
.disposed(by: disposeBag)
// text 实时绑定到 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)
定时器 Time(底层实现原理封装了GCD的Timer)
Observable.interval(1, scheduler: MainScheduler.instance)
.debug()
.subscribe()
.disposed(by: disposeBag)
// 底层实现的是一样的
Observable.timer(1, scheduler: MainScheduler.instance)
URLSession 网络请求
URLSession.shared.rx.response(request: URLRequest(url: URL(string: "www.baidu.com")!))
.debug()
.subscribe()
.disposed(by: disposeBag)
万物皆 Rx
- 实现
ReactiveCompatible
协议
public protocol ReactiveCompatible {
/// Extended type
associatedtype ReactiveBase
@available(*, deprecated, message: "Use `ReactiveBase` instead.")
typealias CompatibleType = ReactiveBase
/// Reactive extensions.
static var rx: Reactive.Type { get set }
/// Reactive extensions.
var rx: Reactive { get set }
}
// NSObject 的子类都有 Rx
extension NSObject: ReactiveCompatible { }
序列
- 创建序列
- 订阅信号
- 发送信号 (onNext, onError, onCompleted)
创建序列
let ob = Observable.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
序列创建流程
- 创建序列 ->
Observable.create
->AnonymousObservable
匿名类部类保存闭包(函数式保存_subscribeHandler
)-> producer.subscribe -> run - 订阅信号 ->
AnonymousObserver
创建一个观察者(通过尾随闭包创建) -> 保存了EventHandler
事件
// 创建序列
let ob = Observable.create {}
-> Create.swift: AnonymousObservable() // 匿名类部类保存 闭包
-> _subscribeHandler
// 订阅
_ = ob.subscribe(onNext: { _ in
}, onError: { _ in
}, onCompleted: {
}) {
}
subscribe{} 实现
let observer = AnonymousObserver { } 创建订阅者,尾随闭包
-> self.asObservable().subscribe(observer)
-> Producer. subscribe
-> AnonymousObservable.run
-> AnonymousObservableSink.run -> _subscribeHandler 发送 event 事件