RxSwift状态更改触发器“;警告:递归调用或同步错误&引用;

RxSwift状态更改触发器“;警告:递归调用或同步错误&引用;,swift,rx-swift,Swift,Rx Swift,我继承了一些Swift 3代码,它使用RxSwift来管理一个商店。课程的基本布局是: class UserActivityStore { fileprivate lazy var internalDataCache: Variable<Set<NSUserActivity>?> = Variable(nil) func addAction(_ actionToAdd: NSUserActivity) { var content = in

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

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
    }
}
类用户活动存储{
fileprivate lazy var internalDataCache:变量=变量(nil)
func addAction(actionToAdd:NSUserActivity){
var content=internalDataCache.value??Set()
内容。插入(操作添加)
internalDataCache.value=内容
}
func resolveAction(uAction:NSUserActivity){
var content=internalDataCache.value
_=内容?删除(操作)
internalDataCache.value=内容
}
func expectActions(filter:@转义((NSUserActivity)->Bool))->可观察{
让observable=observable.create{(observable)->
在中返回self.internalDataCache.asObservable().subscribeNext{(newActions)
guard let newActions=newActions else{return}
用于新操作中的每个操作,其中筛选器(每个操作){
observer.onNext(每一站)
self.resolveAction(每个动作)
}
}
}
可观测回波
}
}
将操作添加到此项时,它会将该项正确添加到集合中。但是,观察者(在
expectActions
中)捕获并解决该更改。由于这些都在一个线程中,因此会触发错误“警告:递归调用或同步错误!”

我认为这是一个完全合法的错误,RxSwift的处理可能是正确的。然而,我不禁认为这是一个糟糕的模式。代码本质上是在处理
nsserActivity
对象本身的队列

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


将observable更改为使用不同的队列(串行或并发调度)解决了问题,但我不认为这是正确的解决方案。

是的,这是一个粗略的设计。其目的似乎是,无论何时添加或删除活动,expectActions Observable都会发送一个与筛选器匹配的所有当前活动的流。是吗?是的,就是这样。