我有一个通过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是一个好的决定。尝试使您的链条更具原子性。

10-06 01:30