一、初步了解
RxSwift的实现概括为4个流程,在RxSwift中,所有异步操作(事件)和数据流均被抽象为可观察序列的概念。
创建序列-订阅序列-发送信号-信号接收
如下面代码,定义button,oc的写法是将button创建和响应事件分离,影响阅读,但是RxSwift直接在闭包中处理响应事件(同理textField观察输入的text),每一个对象将可监听序列绑定到观察者上(对象本身),独立在自己的一块区域。
override func viewDidLoad() {
super.viewDidLoad()
//button
button = UIButton.init(frame: CGRect(x: 40, y: 100, width: width-80, height: 40))
button.backgroundColor = .gray
button.setTitle("按钮", for: .normal)
self.view.addSubview(button)
//修改事件类型 button.rx.controlEvent(.touchUpOutside)
button.rx.tap.subscribe(onNext: { () in
//此处响应点击事件
print("我被点击了")
}).disposed(by: disposeBag)
//textfield
textfield = UITextField.init(frame: CGRect(x: 40, y: 200, width: width-80, height: 40))
textfield.borderStyle = .roundedRect
textfield.placeholder = "请输入内容"
self.view.addSubview(textfield)
//监听输入变化
textfield.rx.text.orEmpty.changed.subscribe(onNext: { (text) in
print(text)
}).disposed(by: disposeBag)
}
二、逐步分析
- Observable 就是可观察序列,也是核心的内容,在RxSwift中,一切都是序列。
// 1:创建序列
let observable = Observable<Any>.create { (obserber) -> Disposable in
// 3:发送信号
obserber.onNext("发送信号")
obserber.onCompleted()
// obserber.onError(NSError.init(domain: "fail", code: 10087, userInfo: nil))
return Disposables.create()
}
// 2:订阅信号
let _ = observable.subscribe(onNext: { (text) in
print("订阅到信号:\(text)")
}, onError: { (error) in
print("error: \(error)")
}, onCompleted: {
print("完成")
}) {
print("销毁")
}
(1)Observable 继承ObservableType,来寻找creat方法,由于是静态方法,看不到实现,所以直接在sdk里面找creat文件。
image.png
(2)可以看到creat最终返回AnonymousObservable对象,并把传进来的闭包 subscribe作为参数。
image.png
(3)查看AnonymousObservable(继承Producer类,可观察序列都继承这个类,后续会分析这个类),可见AnonymousObservable的初始化init里面保存了传进来的参数,即之前的subscribe。上面几步也就是创建序列的过程,返回AnonymousObservable,保存了creat的闭包。
image.png
- subscribe的实现
可见该方法将要实现的闭包作为参数传了进来,内部将闭包的实现声明为一个临时变量,通过event判断执行不同的闭包。 image.png 最后的return,将observer作为参数传给subscribe,asObservable(返回自己,为了将类型转换为序列类型),self.asObservable().subscribe(observer)
,查看这里的subscribe,但是observable没有subscribe方法,来到父类Producer查看。 image.png - 查看 Producer
里面的subscribe方法,主要是实现了run方法,并把observer再次传了出去,可见这里run方法空实现,所以走子类方法。 image.png 这里是子类run方法实现,把observer作为AnonymousObservableSink
(管道)类参数,并执行sink的run方法。 image.png 接着进入AnonymousObservableSink查看,可以看到run方法调用了creat之前保存的闭包parent即AnonymousObservable的别名,_subscribeHandler,也就是保存的闭包
,并把AnonymousObservableSink作为参数传入 image.png
第一步:在创建Observable类的ob对象时,调用的create方法,实际上是保存了我们的create实现的闭包。
第二步:在ob调用subscribe时,已经把订阅的实现逻辑封装到了闭包内,并且把这个闭包封装成了一个叫observer的临时变量,然后调用了AnonymousObservable的subscribe方法。
第三步:AnonymousObservable的subscribe方法,默认创建了AnonymousObservableSink类,并把observer保存成自己属性,又通过该类的run方法调用了第一步里保存的闭包,并把自己作为参数穿进去,用以让第一步保存的闭包成功获得这个observer。
第四步:这样就保证了订阅方法subscribe能获得onNext里的数据。因为subscribe已经持有了Observable创建时声明的闭包。
网友评论