ios - RxSwift 可观察竞争条件

标签 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) 之前就被调用。我该如何解决这个问题?

最佳答案

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

这不是竞争条件。在您订阅selectedElementID之前,您的selectedElementID链和其中的flatMap代码不会被执行。因此,我猜您在 createChildObject 方法中的某个位置订阅了 selectedElementID ,并且显然在 selectedElementID 之前执行了 createChildObject 代码链。

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

关于ios - RxSwift 可观察竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49183310/

相关文章:

ios - Func 不会停止运行

ios - LazyVStack 在更改 SwiftUI 时初始化所有 View

选择下拉选项后,Angular Material Autocomplete observable 会触发额外的时间

javascript - rxjs 内部原生 map 提前退出

ios - 设置 UIScrollView 的 contentInset 为 KeyboardWillShowNotification 无法正常工作

java - 有没有更好的方法来跟踪订阅者的变化?

ios - prepareForSegue 不能快速工作。我该如何解决?

ios - 如何使用 UIActivityIndi​​cator 作为 iOS 的实时状态指示器?

ios - 如何更改 UINavigationBar rightButton 图像?

ios - cordova IOS 应用程序所有 onclick 和后退按钮不适用于最新的 IOS 11.3.1