2
我目前正在用RxSwift取代PromiseKit,并且需要将我的推迟承诺转换为RxSwift。在PromiseKitSwift 3:转换PromiseKit推迟到RxSwift
当前实现的例子:
private var deferredDidLayout = Promise<()>.pending()
override func layoutSubviews() {
super.layoutSubviews()
self.deferredDidLayout.fulfill()
}
func setup() {
_ = self.didLayout().then {_ -> Void in
// Do my stuff only one time!
}
}
private func didLayout() -> Promise<()> {
return self.deferredDidLayout.promise
}
当前下锅实施RxSwift:
private let observableDidLayout = PublishSubject<Void>()
override func layoutSubviews() {
super.layoutSubviews()
self.observableDidLayout.onCompleted()
}
func setup() {
_ = self.observableDidLayout
.subscribe(onCompleted: { _ in
// Do my stuff only one time!
// Issue: Will be executed on every onCompleted() call
})
}
谢谢关于!
PromiseKit:https://github.com/mxcl/PromiseKit RxSwift:https://github.com/ReactiveX/RxSwift
谢谢您的回答! 'Completable'可能是解决方案的一部分。但它不能满足我的整个问题: - 当第一个订阅者通过链接订阅'cacheLocally()'时,'Completable'会发出错误或完成状态。 - 当第二个订阅者订阅'cacheLocally()'时,应该保存上面的状态(错误或完成),意味着'cacheLocally()'应该只执行一次,然后直接执行第二个订阅者onCompleted/onError方法? 以这种方式,'cacheLocally()'不应该创建一个新的'Completable',但可以重复使用。 – PAK
在我原来的问题中,PromiseKit中的实现实现了一次我的deferredDidLayout承诺。如果在deferredDidLayout承诺完成后使用了第二个函数(_ = self.didLayout()。then {}),则第二个函数中{}内的代码将直接执行。 – PAK
@PAK有很多可能性来缓冲/重放Rx中的最后一个状态。可能的,诸如'.asObservable()。materialize()。shareReplay(1)'之类的东西,或者其他'.share()/。replay()'操作符。或者'ReplaySubject'可能更适合。或'BehaviorSubject'。实际上有很多方法,取决于你的具体情况。 –