从 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)