在RxSwift PublishSubject

时间:2016-09-11 21:58:26

标签: swift rx-swift reactivex

我正在寻找类似的东西:

let observable = PublishSubject<String>()
observable.onNext("1")
observable.onCompleted()

_ = observable.subscribeNext { s in
    print(s)
}

所以我想在已经完成之后订阅Observable并仍然获取值(或者只是最后一个值)。

1 个答案:

答案 0 :(得分:21)

您使用了错误的Subject来获取您想要的内容。 Take a look at the descriptions of the Subjects

PublishSubject :在订阅时向所有观察者广播新事件。

ReplaySubject :向所有订阅者广播新事件,并向新订阅者广播指定的bufferSize先前事件数。

BehaviorSubject :向所有订阅者广播新事件,向新订阅者广播最新(或初始)值。

变量:包装BehaviorSubject,因此它会向新订阅者发出最新(或初始)值。并且Variable还保持当前值状态。变量永远不会发出错误事件。但是,它会自动发出一个Completed事件并在deinit上终止。

所以,不要使用PublishSubject,因为它只会在订阅时广播新事件

您可以使用ReplaySubject获取之前的所有活动,也可以使用ReplaySubjectBehaviorSubjectVariable来获取最新值。

let disposeBag = DisposeBag()

// ALL previous events
let subject = ReplaySubject<String>.createUnbounded()
// or use this to get just the last, say, 4:
//   let subject = ReplaySubject<String>.create(bufferSize: 4)
// or use one of these to get the most recent:
//   let subject = ReplaySubject<String>.create(bufferSize: 1)
//   let subject = BehaviorSubject(value: "blah")
//   let subject = Variable("blah")

subject.onNext("blah")
subject.onNext("foo")
subject.onCompleted()

subject
    .asObservable()
    .subscribeNext { print($0) }
    .addDisposableTo(disposeBag)

输出:

  

嗒嗒
  FOO