RxSwift tips - 多次订阅同一个信号

image.png

对同一个信号多次订阅会发生什么情况呢?我们来看看这段代码:

var start = 0
let getStartNumber: () -> Int = {
    start += 1
    return start
}
        
let numbers = Observable<Int>.create{
    let start = getStartNumber()
    $0.onNext(start)
    $0.onNext(start + 1)
    $0.onNext(start + 2)
    $0.onCompleted()
    return Disposables.create()  
}
        
numbers
    .subscribe(onNext: { (el) in
        print("element [\(el)]")
    }, onCompleted: {
        print("----------")
    }).disposed(by: disposebag)

numbers
    .subscribe(onNext: { (el) in
        print("element [\(el)]")
    }, onCompleted: {
        print("----------")
    }).disposed(by: disposebag)
/*
element [1]
element [2]
element [3]
----------
element [2]
element [3]
element [4]
----------
*/

Rx 中的 Observables 是一个拉驱动的事件序列。

推驱动:在创建的时候,序列中的值不会被立即赋值,之后才会被赋值。(网络请求)

拉驱动:在创建信号的时候,序列中的值就会被确定下来,我们可以从流中一个一个的拿到值

对一个 Observable 使用各种操作符都不会产生什么实际的效果。一旦调用了 subscribe(...) 也就是说一旦有东西订阅了这个信号之后,它才会开始发出事件序列。

每次订阅这个信号, observable 都会执行 create 这个闭包。

上面代码最后的结果也是因为这个原因:

每一次调用subscribe(...) ,也就是订阅某个信号,都会给这次订阅创建新的信号。所以也很难保证每个都是一样的。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本篇文章介主要绍RxJava中操作符是以函数作为基本单位,与响应式编程作为结合使用的,对什么是操作、操作符都有哪些...
    嘎啦果安卓兽阅读 2,924评论 0 10
  • 本文章内部分图片资源来自RayWenderlich.com 本文结合自己的理解来总结介绍一下RxSwift最基本的...
    FKSky阅读 2,950评论 4 14
  • 最近在学习RxSwift相关的内容,在这里记录一些基本的知识点,以便今后查阅。 Observable 在RxSwi...
    L_Zephyr阅读 1,805评论 1 4
  • 作者: maplejaw本篇只解析标准包中的操作符。对于扩展包,由于使用率较低,如有需求,请读者自行查阅文档。 创...
    maplejaw_阅读 45,967评论 8 93
  • 响应式编程简介 响应式编程是一种基于异步数据流概念的编程模式。数据流就像一条河:它可以被观测,被过滤,被操作,或者...
    说码解字阅读 3,188评论 0 5