我有一个从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)
。我该如何解决这个问题?
答案 0 :(得分:0)
我不确定我是否从描述中完全理解了你的问题,但这里有一些想法:
这不是竞争条件。在table.dataTable.dtr-inline.collapsed>tbody>tr>td:first-child:before,
table.dataTable.dtr-inline.collapsed>tbody>tr>th:first-child:before {
left: auto;
right: 4px;
selectedElementID
之前,您的flatMap
链及其中的subscribe
代码将不会执行。所以我猜您在selectedElementID
方法中的某个地方订阅selectedElementID
,显然会在createChildObject
链之前执行createChildObject
代码。
根据selectedElementID
rx调用的设计方式以及您如何订阅keychainStore
observable,您可能会遇到竞争条件,但我不确定使用selectedElementID
是否是一个好的决定这个案例。尝试让你的链更具原子性。