RxSwift状态更改触发器"警告:递归调用或同步错误!"

时间:2017-04-19 12:50:14

标签: swift rx-swift

我继承了一些使用RxSwift管理商店的Swift 3代码。该课程的基本布局是:

class UserActivityStore {
    fileprivate lazy var internalDataCache: Variable<Set<NSUserActivity>?> = Variable(nil)

    func addAction(_ actionToAdd: NSUserActivity) {
        var content = internalDataCache.value ?? Set<NSUserActivity>()
        content.insert(actionToAdd)
        internalDataCache.value = content
    }

    func resolveAction(_ action: NSUserActivity) {
        var content = internalDataCache.value
        _ = content?.remove(action)
        internalDataCache.value = content
    }

    func expectActions(_ filter: @escaping ((NSUserActivity) -> Bool)) -> Observable<NSUserActivity> {
        let observable = Observable<NSUserActivity>.create { (observer) -> Disposable in
            return self.internalDataCache.asObservable().subscribeNext { (newActions) in
                guard let newActions = newActions else { return }
                for eachAction in newActions where filter(eachAction) {
                    observer.onNext(eachAction)
                    self.resolveAction(eachAction)
                }
            }
        }
        return observable
    }
}

当向其添加操作时,它会正确地将项目添加到集合中。但是,观察者(在expectActions中)捕获了这种变化并将其解决。因为这都在一个线程中,所以错误&#34;警告:递归调用或同步错误!&#34;被触发了。

我认为这是一个完全合法的错误,RxSwift在处理方面可能是正确的。但是,我不能不认为这是一个糟糕的模型。代码本质上是处理NSUserActivity个对象的队列。

这真的是RxSwift的建模错误/滥用,还是我对RxSwift误解的有限理解?作为一个hacky解决方案,我尝试用单行resolveAction替换internalDataCache.value?.remove(action)函数,但仍然会触发observable,从而触发bug。

更改observable以使用不同的队列(串行或并发调度)可以解决问题,但我不相信它是正确的解决方案。

0 个答案:

没有答案