2017-08-25 2 views
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

答えて

2

私は 'Completableは' あなたが探しているものであると信じている - https://github.com/ReactiveX/RxSwift/blob/master/Documentation/Traits.md#creating-a-completable

+0

は、あなたの答えをありがとう! 'Completable'はソリューションの一部である可能性があります。しかし、それは私の問題全体を満足させていません。 - あなたのリンクから最初のサブスクライバが 'cacheLocally()'に加入したとき、 'Completable'はエラーまたは完了した状態を出します。 - 2番目のサブスクライバが 'cacheLocally()'に加入している場合は、上記の状態(エラーまたは完了)を保存する必要があります。つまり、 'cacheLocally()'を1回だけ実行してから2番目のサブスクライバonCompleted/onError ? このように 'cacheLocally()'は新しい 'Completable'を作成すべきではありませんが、同じものを再利用してください。 – PAK

+0

私のオリジナルの質問では、PromiseKitの実装は、私のdeferredDidLayoutの約束を一度満たしています。また、deferredDidLayout約束が満たされた後に2番目の関数(_ = self.didLayout()。then {})が使用された場合、2番目の関数の{}内のコードが直接実行されます。 – PAK

+1

@PAK Rxの最後の状態をバッファリング/再生する方法はたくさんあります。おそらく、 '.asObservable()。materialize()。shareReplay(1)'やその他の '.share()/。replay()'のようなものがあります。あるいは、「ReplaySubject」がうまくいくでしょう。または 'BehaviorSubject'。実際にそれを行う方法はたくさんありますが、あなたの特定の場合に依存します。 –

関連する問題