Swift3 Swift 3:将PromiseKit转换为RxSwift

Swift3 Swift 3:将PromiseKit转换为RxSwift,swift3,reactive-programming,deferred,rx-swift,rx-cocoa,Swift3,Reactive Programming,Deferred,Rx Swift,Rx Cocoa,我目前正在用RxSwift替换PromiseKit,需要将我的延迟承诺转换为RxSwift PromiseKit中的当前实现示例: private var deferredDidLayout = Promise<()>.pending() override func layoutSubviews() { super.layoutSubviews() self.deferredDidLayout.fulfill() } func setup() { _ =

我目前正在用RxSwift替换PromiseKit,需要将我的延迟承诺转换为RxSwift

PromiseKit中的当前实现示例:

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 var deferredidlayout=Promise.pending()
覆盖func布局子视图(){
super.layoutSubviews()
self.deferredidlayout.fulfill()文件
}
函数设置(){
_=self.didLayout()。然后{{u0->Void in
//我的东西只做一次!
}
}
private func didLayout()->Promise{
返回self.deliveredidlayout.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
     })
}
private let observedidlayout=PublishSubject()
覆盖func布局子视图(){
super.layoutSubviews()
self.observedidlayout.onCompleted()
}
函数设置(){
_=自可观察布局
.订阅(未完成:{in
//我的东西只做一次!
//问题:将在每次onCompleted()调用时执行
})
}
谢谢你

承诺书:
RxSwift:

我相信“可完成的”是您想要的-

谢谢您的回答“Completable”可能是解决方案的一部分。但这并不能解决我的全部问题:-当第一个订户从您的链接订阅“cachelocal()”时,“Completable”会发出错误或完成状态。-当第二个订阅服务器订阅“CacheLocal()”时,应保存上述状态(错误或已完成),这意味着“CacheLocal()”只应执行一次,然后直接执行第二个订阅服务器的onCompleted/onError方法?这样,“cachelocal()”就不应该创建一个新的“Completable”,而是重复使用相同的“Completable”。在我最初的问题中,PromiseKit中的实现实现了我的延迟IDLayout承诺一次。如果第二个函数(=self.didLayout().then{})在DelferredIDLayout承诺实现后使用,则第二个函数中{}内的代码将直接执行。@PAK有很多可能缓冲/重放Rx中的最后一个状态。可能可以使用诸如“.asObservable().materialize().shareReplay(1)”之类的运算符,或者其他一些“.share()/.replay()”运算符。或者“ReplaySubject”更合适。或“行为主体”。根据你的具体情况,有很多方法可以做到这一点。shareReplay(1)正是我想要的。非常感谢。
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
     })
}