从 create 闭包外部触发一个?
Trigger a single from outside the create closure?
我对这一切都不熟悉,如果我的 RX 术语有点不对,请见谅。
所以我想实现一个仅在收到系统回调时发出一次的可观察对象。基本上这个想法是,通过订阅这个可观察对象,可以保证在执行订阅闭包时系统事件已经发生。如果系统事件已经发生,它可能会立即执行,或者可能会延迟到事件发生,或者如果系统回调从未执行过,则永远不会执行。
似乎 Single 非常适合用例,因为它旨在成为成功或失败的一次性可观察对象。但似乎一个可完成的 success
回调只能从 Single.create {}
内部触发。
我通过在 create 闭包中订阅单个来创建了一个变通方法,但感觉就像一个 hack:
class MyClass {
private var systemCallbackSubject = AsyncSubject<Bool>()
var isReady : Single<Void> {
let single = Single<Bool>.create { single in
self.systemCallbackSubject.subscribe(onCompleted: {
single(.success(()))
}, onDisposed: nil)
return Disposables.create {}
}
return single
}
func onSystemEventCallback() {
systemCallbackSubject.onCompleted()
}
}
是否有更好的方法来实现此行为?
实施似乎与预期行为不符。如果我理解正确,您愿意多次订阅并仅在事件发生时获得结果。
在这种情况下,我会使用没有初始值的 BehaviorSubject。每次您订阅它时,它都会 return 最新值(如果存在)。如果订阅后更改,将收到更改。如果您想要严格尝试 1 次,请添加
.取(1)。您还可以通过添加 .take(1).toSingle()
将其转换为 Single
或者 .replay(1)
我对这一切都不熟悉,如果我的 RX 术语有点不对,请见谅。
所以我想实现一个仅在收到系统回调时发出一次的可观察对象。基本上这个想法是,通过订阅这个可观察对象,可以保证在执行订阅闭包时系统事件已经发生。如果系统事件已经发生,它可能会立即执行,或者可能会延迟到事件发生,或者如果系统回调从未执行过,则永远不会执行。
似乎 Single 非常适合用例,因为它旨在成为成功或失败的一次性可观察对象。但似乎一个可完成的 success
回调只能从 Single.create {}
内部触发。
我通过在 create 闭包中订阅单个来创建了一个变通方法,但感觉就像一个 hack:
class MyClass {
private var systemCallbackSubject = AsyncSubject<Bool>()
var isReady : Single<Void> {
let single = Single<Bool>.create { single in
self.systemCallbackSubject.subscribe(onCompleted: {
single(.success(()))
}, onDisposed: nil)
return Disposables.create {}
}
return single
}
func onSystemEventCallback() {
systemCallbackSubject.onCompleted()
}
}
是否有更好的方法来实现此行为?
实施似乎与预期行为不符。如果我理解正确,您愿意多次订阅并仅在事件发生时获得结果。
在这种情况下,我会使用没有初始值的 BehaviorSubject。每次您订阅它时,它都会 return 最新值(如果存在)。如果订阅后更改,将收到更改。如果您想要严格尝试 1 次,请添加 .取(1)。您还可以通过添加 .take(1).toSingle()
将其转换为 Single或者 .replay(1)