美文网首页
RxSwift-搞事情(一)

RxSwift-搞事情(一)

作者: Harry_upup | 来源:发表于2019-07-29 18:20 被阅读0次

    一、初步了解

    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创建时声明的闭包。

    相关文章

      网友评论

          本文标题:RxSwift-搞事情(一)

          本文链接:https://www.haomeiwen.com/subject/syibrctx.html