本篇会先介绍一些RxSwift这个响应式框架的基本使用。
RxSwift学习的必要性
复合 - Rx 就是和复合的代名词
复用 - 复用性比较强,代码量降低
清晰 - 因为声明都是不可变更,代码函数式编程可读性强
易用 - 理解容易,还抽象了异步编程,统一代码风格
稳定 - 因为Rx是完全通过单元测试的
RxSwift 基本介绍
gitHub地址
https://github.com/ReactiveX/RxSwift
如何导入
CocoaPods
# 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
Carthage
github "ReactiveX/RxSwift" ~> 5.0
RxSwift基本使用
下面针对UIButton为例子做一个举例
比如我们点击了一个Btn,想要做一些事情
正常写法
self.button.addTarget(self, action: #selector(clickAction), for: .touchUpInside)
//然后定义这个方法
@objc func clickAction(){
print("点击了btn")
}
RxSwift写法
self.button.rx.controlEvent(.touchUpOutside)
.subscribe(onNext: { () in
print("点击了btn")
})
.disposed(by: disposeBag)
另一中写法
self.button.rx.tap
.subscribe(onNext: { () in
print("点击了btn")
})
.disposed(by: disposeBag)
这个时候就比较有意思了,为什么通过调用rx.tap也可以实现这样的效果呢?
/*
我们点击到tap里面查看,发现它返回的其实就是上面的controlEvent(.touchUpInside),
也就是说开发者为了我们使用,将这个东东直接简化成了.tap,去代替了controlEvent(.touchUpInside)
毕竟我们使用UIButton大部分都是使用的UIControlTouchUpInside
**/
extension Reactive where Base: UIButton {
/// Reactive wrapper for `TouchUpInside` control event.
public var tap: ControlEvent {
return controlEvent(.touchUpInside)
}
}
RxSwift核心-Observable
通过上面的介绍之后,我们再来研究一下RxSwift是如何实现这一系列的事情的。
1.创建序列
通过Observable.create来创建一个可被观察的序列
let ob = Observable.create { (obserber) -> Disposable in
return Disposables.create()
}
2.订阅序列
通过ob.subscribe来订阅
3.发送信号
通过.next() .onCompleted() .onError来发送信号
具体代码如下
// 1:创建序列
let ob = Observable.create { (obserber) -> Disposable in
// 3:发送信号
obserber.onNext("继续")
obserber.onCompleted()
obserber.onError(NSError.init(domain: "coocieeror", code: 10087, userInfo: nil))
return Disposables.create()
}
// 2:订阅信号
let _ = ob.subscribe(onNext: { (text) in
print("订阅")
}, onError: { (error) in
print("error: \(error)")
}, onCompleted: {
print("完成")
}) {
print("销毁")
}
具体解释目前还没有理解完整,后期持续更新关于Observable核心流程相关问题。欢迎大家指正~