从创建闭包之外触发一个?

时间:2017-11-23 12:43:10

标签: rx-swift

我是所有这一切的新手,如果我的RX术语有点失效,请道歉。

所以我想实现一个observable,它只在收到系统回调时发出一次。基本上,这个想法是通过订阅这个observable,可以保证在执行订阅闭包时系统事件已经发生。如果系统事件已经发生,它可以立即执行,或者可以在事件发生之前推迟,或者如果系统回调从未执行则永远不会执行。

似乎Single是一个合理的用例,因为它是一次性可观察的成功或失败。但似乎只能从success内部触发可完成的Single.create {}回调。

我通过订阅创建闭包中的单个内容来创建一个解决方法,但感觉就像一个黑客:

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()
    }

}

有没有更好的方法来实现这种行为?

1 个答案:

答案 0 :(得分:1)

实现似乎与期望的行为不匹配。如果我理解正确,您愿意多次订阅并仅在事件发生时获得结果。

在这种情况下,我会使用没有初始值的 BehaviorSubject 。每次订阅它时,它都会返回最新值(如果存在)。如果订阅后更改,将收到更改。如果您想要严格1次尝试,请添加 。取(1)。您还可以通过添加 .take(1).toSingle()

将其转换为单身

或者 .replay(1)