RxSwift-搞事情(一)


一、初步了解

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.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文件。
RxSwift-搞事情(一)_第1张图片
image.png

(2)可以看到creat最终返回AnonymousObservable对象,并把传进来的闭包 subscribe作为参数。
image.png
(3)查看AnonymousObservable(继承Producer类,可观察序列都继承这个类,后续会分析这个类),可见AnonymousObservable的初始化init里面保存了传进来的参数,即之前的subscribe。上面几步也就是创建序列的过程,返回AnonymousObservable,保存了creat的闭包。
RxSwift-搞事情(一)_第2张图片
image.png
  • subscribe的实现
    可见该方法将要实现的闭包作为参数传了进来,内部将闭包的实现声明为一个临时变量,通过event判断执行不同的闭包。
    RxSwift-搞事情(一)_第3张图片
    image.png
    最后的return,将observer作为参数传给subscribe,asObservable(返回自己,为了将类型转换为序列类型),self.asObservable().subscribe(observer),查看这里的subscribe,但是observable没有subscribe方法,来到父类Producer查看。
    RxSwift-搞事情(一)_第4张图片
    image.png
  • 查看 Producer
    里面的subscribe方法,主要是实现了run方法,并把observer再次传了出去,可见这里run方法空实现,所以走子类方法。
    RxSwift-搞事情(一)_第5张图片
    image.png
    这里是子类run方法实现,把observer作为AnonymousObservableSink(管道)类参数,并执行sink的run方法。
    RxSwift-搞事情(一)_第6张图片
    image.png
    接着进入AnonymousObservableSink查看,可以看到run方法调用了creat之前保存的闭包parent即AnonymousObservable的别名,_subscribeHandler,也就是保存的闭包,并把AnonymousObservableSink作为参数传入
    RxSwift-搞事情(一)_第7张图片
    image.png

第一步:在创建Observable类的ob对象时,调用的create方法,实际上是保存了我们的create实现的闭包。
第二步:在ob调用subscribe时,已经把订阅的实现逻辑封装到了闭包内,并且把这个闭包封装成了一个叫observer的临时变量,然后调用了AnonymousObservable的subscribe方法。
第三步:AnonymousObservable的subscribe方法,默认创建了AnonymousObservableSink类,并把observer保存成自己属性,又通过该类的run方法调用了第一步里保存的闭包,并把自己作为参数穿进去,用以让第一步保存的闭包成功获得这个observer。
第四步:这样就保证了订阅方法subscribe能获得onNext里的数据。因为subscribe已经持有了Observable创建时声明的闭包。

你可能感兴趣的:(RxSwift-搞事情(一))