RxSwift开篇

阅读 RxSwift 源码的目的

RxSwift采用面向协议编程思想,函数式编程,堪称教科书式编码,想要写好Swift的代码,都应该读读其核心代码,了解其编程思想以及编程技巧

Hello RxSwift

先看看hello world 代码

/*:
 ### Observables and observers (aka subscribers)
 
 `Observable`s will not execute their subscription closure unless there is a subscriber. In the following example, the closure of the `Observable` will never be executed, because there are no subscribers:
 */
example("Observable with no subscribers") {
    _ = Observable<String>.create { (observerOfString: AnyObserver<String>) -> Disposable in
        print("This will never be printed")
        
        
        observerOfString.on(.next("😬"))
        observerOfString.on(.completed)
        return Disposables.create()
    }
}

这段代码的闭包永远不会执行,那为什么它不会执行呢?我们跟踪一下

extension ObservableType {
    // MARK: create

    /**
     Creates an observable sequence from a specified subscribe method implementation.

     - seealso: [create operator on reactivex.io](http://reactivex.io/documentation/operators/create.html)

     - parameter subscribe: Implementation of the resulting observable sequence's `subscribe` method.
     - returns: The observable sequence with the specified implementation for the `subscribe` method.
     */
    public static func create(_ subscribe: @escaping (AnyObserver<E>) -> Disposable) -> Observable<E> {
        return AnonymousObservable(subscribe)
    }
}

ObservableType 是一个协议,协议扩展了一个create方法,对协议不太熟悉请查阅相关:面向协议编程协议扩展资料
该方法返回 AnonymousObservable 类,那么我们仔细看看 AnonymousObservable 这个类

final fileprivate class AnonymousObservable<Element> : Producer<Element> {
    typealias SubscribeHandler = (AnyObserver<Element>) -> Disposable

    let _subscribeHandler: SubscribeHandler

    init(_ subscribeHandler: @escaping SubscribeHandler) {
        _subscribeHandler = subscribeHandler
    }

    override func run<O : ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {
        let sink = AnonymousObservableSink(observer: observer, cancel: cancel)
        let subscription = sink.run(self)
        return (sink: sink, subscription: subscription)
    }
}

看到这里大家应该明白了,create函数只是简单的创建一个实体类,这个实体类在初始化的时候只是简单的持有这个闭包,并没有执行这个闭包

技巧解析

final fileprivate class AnonymousObservable<Element> : Producer<Element> 

  • final : 表示该类不可被继承,能够保证其方法能够正确执行,禁止对该类进行继承,然后override 其方法,属性,以致于得到非预期的结果
  • fileprivate : 确定权限,确保只有同属于一个文件的类,才能直接初始化该类
  • AnonymousObservable:匿名Observable,这个类对外是不可见的,如果仅限于使用Rx,都无需知道它的具体存在,良好的封装性保证其透明性

透明性: 实际存在的东西,用户却感知不到它的存在,例如你使用http协议,你就感受不到tcp协议,tcp协议对于你来说就是透明的,好像根本不存在一样

那为什么说它是透明的呢? 首先你从外部没法直接初始化该类,你只能通过调用create方法初始化该类,但是该方法返回的是Observable 对象,这样用户根本不知道AnonymousObservable的存在,事实上用户也不用关心他到底是不是AnonymousObservable

Rx尽可能避免返回具体的Observable具体类型,确保用户不需要关心具体的内部细节。

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

推荐阅读更多精彩内容

  • RxSwift是通过使用可观察序列和功函数式运算来组合异步和基于事件的代码库,允许通过调度程序进行参数化执行。 R...
    大灰很阅读 551评论 1 1
  • asynchronous programming: 下载图片,点击按钮事件,播放音乐,键盘显示等。它们不会阻塞各种...
    V_coa阅读 324评论 0 0
  • 花开蝶有意, 叶落谁无情。 四下疾风起, 一山恶兽惊。
    沈明东阅读 115评论 0 1
  • 为什么写这个,因为意识到自己是讨好型人格。总是以别人的需求为先,不敢提出自己的要求和想法,怕别人不喜欢自己。在知乎...
    邺君阅读 353评论 0 0
  • 总觉得自己非常的幸运,每次走到死胡同的时候,总会有人拉一把,不至于掉入万丈深渊,尸骨不存。 J老师的4好学生,让我...
    左叶右李阅读 186评论 2 0