2
私は現在、PromiseKitをRxSwiftに置き換えており、延期された約束をRxSwiftに変換する必要があります。Swift 3:PromiseKitをRxSwiftに変換します
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
}
現在のハック-実装:
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'はエラーまたは完了した状態を出します。 - 2番目のサブスクライバが 'cacheLocally()'に加入している場合は、上記の状態(エラーまたは完了)を保存する必要があります。つまり、 'cacheLocally()'を1回だけ実行してから2番目のサブスクライバonCompleted/onError ? このように 'cacheLocally()'は新しい 'Completable'を作成すべきではありませんが、同じものを再利用してください。 – PAK
私のオリジナルの質問では、PromiseKitの実装は、私のdeferredDidLayoutの約束を一度満たしています。また、deferredDidLayout約束が満たされた後に2番目の関数(_ = self.didLayout()。then {})が使用された場合、2番目の関数の{}内のコードが直接実行されます。 – PAK
@PAK Rxの最後の状態をバッファリング/再生する方法はたくさんあります。おそらく、 '.asObservable()。materialize()。shareReplay(1)'やその他の '.share()/。replay()'のようなものがあります。あるいは、「ReplaySubject」がうまくいくでしょう。または 'BehaviorSubject'。実際にそれを行う方法はたくさんありますが、あなたの特定の場合に依存します。 –