美文网首页
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-搞事情(一)

    一、初步了解 RxSwift的实现概括为4个流程,在RxSwift中,所有异步操作(事件)和数据流均被抽象为可观察...

  • RxSwift-搞事情(二)

    RxSwift-搞事情(一)上次说到RxSwift的核心逻辑,发现有些东西并没想象中简单,这次再来补充一哈。搞事情...

  • 搞事情?搞事情!

    看了看招聘软件 我有点方= 0 =,与好友吐槽时还一副大义凛然的样子说 谁爱干谁干 老子不伺候了 现实就...

  • 搞事情,搞大事情

    前天物理老师找我:“你想帮我画个画吗?” ??? 难道让我上课前帮她在黑板上画个电路图? “…行。” “好嘞,我跟...

  • 搞事情

    先上个成功的酸奶。继三次酸奶失败就放出豪言,我一定会回来的。自换了新买的发酵粉之后,终于成功了。 然后接着搞事情—...

  • 搞事情

  • 搞事情

    心情不好的时候,好想搞点事情出来。以前还能出去喝酒,现在得喂奶,搞不成了,感觉现在不是我的地盘,我做不了主啊。女儿...

  • 搞事情

    堂堂男儿七尺高齐心协力把事搞不惧明日无进路敢向权威挥几刀

  • 搞事情

    我, 无聊的时候会胡思乱想, 愉快的时候会异想天开, 异想天开的时候会搞事情。 我的发型大致分为三个阶段 小学超短...

  • 搞事情!

网友评论

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

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