`sample`在完成后触发。怎么避免?

时间:2016-04-24 13:22:20

标签: swift reactive-programming rx-swift

let stream = PublishSubject<Int>()
let trigger = PublishSubject<Void>()

stream.sample(trigger).subscribeNext { value in print("value \(value)") }

stream.onNext(5)
trigger.onCompleted()

以上打印&#34;值5&#34;到控制台。我发现这令人惊讶,因为我从未在触发器上调用onNext()。

在我的情况下,trigger表示保存按钮rx_tapstream表示要保存的有效输入。我的问题是,当触发器完成时(在销毁时)流就会被保存,即使它没有被轻击。

1 个答案:

答案 0 :(得分:1)

嗯,sample确实会触发onCompleted 你可以在这里查找: http://reactivex.io/documentation/operators/sample.html

在您的情况下,它的工作正常。

通常情况下,当您将observers添加到DisposeBag时,它将在行李处理时处理。
例如:当ViewControllers或ViewModels为deinit时...

所以,解决方案就是不要调用onCompleted来处置observers

stream.sample(trigger)
      .subscribeNext { value in print("value \(value)") }
      .addDisposableTo(disposeBag)

stream.onNext(5)