我有一个通过使用可观察对象的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
之前,您的selectedElementID
链和其中的flatMap
代码不会被执行。因此,我猜您在 createChildObject
方法中的某个位置订阅了 selectedElementID
,并且显然在 selectedElementID
之前执行了 createChildObject
代码链。
根据 keychainStore
rx 调用的设计方式以及订阅 selectedElementID
observable 的方式,您可能会遇到竞争条件,但我不确定使用 RxSwift在这种情况下,
是一个不错的决定。尝试让你的链更加原子化。
关于ios - RxSwift 可观察竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49183310/