RxSwift可观察的比赛状况

时间:2018-03-08 22:09:08

标签: ios swift observable rx-swift

我有一个从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)。我该如何解决这个问题?

1 个答案:

答案 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是否是一个好的决定这个案例。尝试让你的链更具原子性。