【问题标题】:RxSwift Observable race conditionRxSwift 可观察的竞争条件
【发布时间】:2018-03-08 22:09:08
【问题描述】:

我有一个从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 类型。 createChildObject(with:) 甚至在 observer.onNext(element) 执行之前就被调用了。我该如何解决这个问题?

【问题讨论】:

  • 不确定elementID是什么类型的对象,但如果你能做到{ $0 == $1 },它符合Equatable,这意味着你可以只写.distinctUntilChanged()并省略相等闭包。跨度>

标签: ios swift observable rx-swift


【解决方案1】:

我不确定我是否从描述中完全理解您的问题,但这里有一些想法:

这不是竞争条件。你的selectedElementID 链和其中的flatMap 代码不会在你subscribeselectedElementID 之前执行。所以我猜你在createChildObject 方法中的某个地方订阅了selectedElementID,并且显然在selectedElementID 链之前执行了createChildObject 代码。

根据keychainStore rx 调用的设计方式以及您订阅selectedElementID observable 的方式,您可能会遇到竞争条件,但我不确定在这种情况下使用RxSwift 是一个好的决定。试着让你的链更加原子化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-20
    • 1970-01-01
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    相关资源
    最近更新 更多