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

回答

2
+0

謝謝您的回答! 'Completable'可能是解決方案的一部分。但它不能滿足我的整個問題: - 當第一個訂閱者通過鏈接訂閱'cacheLocally()'時,'Completable'會發出錯誤或完成狀態。 - 當第二個訂閱者訂閱'cacheLocally()'時,應該保存上面的狀態(錯誤或完成),意味着'cacheLocally()'應該只執行一次,然後直接執行第二個訂閱者onCompleted/onError方法? 以這種方式,'cacheLocally()'不應該創建一個新的'Completable',但可以重複使用。 – PAK

+0

在我原來的問題中,PromiseKit中的實現實現了一次我的deferredDidLayout承諾。如果在deferredDidLayout承諾完成後使用了第二個函數(_ = self.didLayout()。then {}),則第二個函數中{}內的代碼將直接執行。 – PAK

+1

@PAK有很多可能性來緩衝/重放Rx中的最後一個狀態。可能的,諸如'.asObservable()。materialize()。shareReplay(1)'之類的東西,或者其他'.share()/。replay()'操作符。或者'ReplaySubject'可能更適合。或'BehaviorSubject'。實際上有很多方法,取決於你的具體情況。 –