我有一个通过flatMap
观察得到的对象。
private lazy var childObj: chilView? = {
let keychainStore = Realm().getStore()
let selectedElementID = keychainStore.elementID
.asObservable()
.distinctUntilChanged {$0 == $1}
.flatMap({ (elementID) -> Observable<Element?> in
guard let elementID = elementID else {
return Observable.error(Errors.InvalidElementID)
}
return Observable.create { observer in
let elementStream: Observable<Result<Element>> = keychainStore.getObservable(id: elementID)
elementStream.subscribe(onNext: { (result) in
switch result {
case .success(let element):
observer.onNext(element)
default: break
}
})
.disposed(by: self.disposeBag)
return Disposables.create()
}
})
return self.createChildObject(with: selectedElementID)
}()
selectedElement的类型为flatMap observable。
createChildObject(with:)
甚至在执行observer.onNext(element)
之前就被调用。我该如何解决? 最佳答案
我不确定我是否从描述中完全理解了您的问题,但是这里有一些想法:
这不是比赛条件。 selectedElementID
链和其中的flatMap
代码在您subscribe
进入selectedElementID
之前将不会执行。因此,我想您在selectedElementID
方法内的某个地方订阅了createChildObject
,显然可以在createChildObject
链之前执行selectedElementID
代码。
根据keychainStore
rx调用的设计方式以及您如何观察selectedElementID
的订阅方式,您可能会遇到竞争状况,但是在这种情况下,我不确定使用RxSwift
是一个好的决定。尝试使您的链条更具原子性。