在 RxSwift 中处理一次性可观察对象的正确方法
Proper way to dispose a one-off observable in RxSwift
我有一个我只想启动一次的 Observable。文档说:
Using dispose bags or takeUntil operator is a robust way of making sure resources are cleaned up. We recommend using them in production even if the sequences will terminate in finite time.
我的 Observable 在一个事件后终止
let observable = Observable.create() { observer in
webservice.makeHTTPRequestWithCompletionBlock {
if something {
observer.on(.Next(...))
observer.onCompleted()
} else {
observer.on(.Error(...))
}
}
}
假设我对取消订阅者不感兴趣,我只想 运行 一次完成。我希望这个可观察对象的生命周期在工作本身完成时结束。这意味着我看不到适合 disposeBag 的候选人。 takeUntil 还期望 'event',但我看不到好的。
现在我只是通过扔掉一次性用品来解决警告:
_ = observeable.subscribeNext { ... }
有没有办法做到这一点,或者我应该使用不同的范例?
DiposeBag
和 takeUntil
都用于在 收到 .Completed/.Error
事件之前取消订阅。
当 Observable
完成时,所有用于管理订阅的资源都会自动销毁。
从 RxSwift 2.2 开始,您可以在 AnonymousObservable.swift
中看到此行为的实现示例
func on(event: Event<E>) {
switch event {
case .Next:
if _isStopped == 1 {
return
}
forwardOn(event)
case .Error, .Completed:
if AtomicCompareAndSwap(0, 1, &_isStopped) {
forwardOn(event)
dispose()
}
}
}
查看 AnonymousObservableSink
在转发事件后收到 .Error
或 .Completed
事件时如何调用自身。
总而言之,对于此用例,_ =
是可行的方法。
我有一个我只想启动一次的 Observable。文档说:
Using dispose bags or takeUntil operator is a robust way of making sure resources are cleaned up. We recommend using them in production even if the sequences will terminate in finite time.
我的 Observable 在一个事件后终止
let observable = Observable.create() { observer in
webservice.makeHTTPRequestWithCompletionBlock {
if something {
observer.on(.Next(...))
observer.onCompleted()
} else {
observer.on(.Error(...))
}
}
}
假设我对取消订阅者不感兴趣,我只想 运行 一次完成。我希望这个可观察对象的生命周期在工作本身完成时结束。这意味着我看不到适合 disposeBag 的候选人。 takeUntil 还期望 'event',但我看不到好的。
现在我只是通过扔掉一次性用品来解决警告:
_ = observeable.subscribeNext { ... }
有没有办法做到这一点,或者我应该使用不同的范例?
DiposeBag
和 takeUntil
都用于在 收到 .Completed/.Error
事件之前取消订阅。
当 Observable
完成时,所有用于管理订阅的资源都会自动销毁。
从 RxSwift 2.2 开始,您可以在 AnonymousObservable.swift
func on(event: Event<E>) {
switch event {
case .Next:
if _isStopped == 1 {
return
}
forwardOn(event)
case .Error, .Completed:
if AtomicCompareAndSwap(0, 1, &_isStopped) {
forwardOn(event)
dispose()
}
}
}
查看 AnonymousObservableSink
在转发事件后收到 .Error
或 .Completed
事件时如何调用自身。
总而言之,对于此用例,_ =
是可行的方法。