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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容

  • 发现 关注 消息 RxSwift入坑解读-你所需要知道的各种概念 沸沸腾关注 2016.11.27 19:11*字...
    枫叶1234阅读 2,797评论 0 2
  • 在正文开始之前的最后,放上GitHub链接和引入依赖的gradle代码: Github: https://gith...
    苏苏说zz阅读 678评论 0 2
  • 在正文开始之前的最后,放上 GitHub 链接和引入依赖的 gradle 代码: Github: https://...
    松江野人阅读 5,894评论 0 1
  • 这两天中午有事情都没有睡午觉,下午工作的时候也没有觉得特别困,只是到了晚上一到这个点,就头都抬不起来了。按理说,我...
    菲菲大王嘟嘟嘟阅读 470评论 0 0
  • 今夜 无雨无风 形单影孤的眼 看不清车流、红绿灯 夜色朦胧 不是凉,感觉冷 郁闷是天幕,压抑是网 昏昏沉沉
    夕阳在山阅读 166评论 0 0