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'。實際上有很多方法,取決於你的具體情況。 –