2017-08-25 178 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'。实际上有很多方法,取决于你的具体情况。 –