RxSwift状态更改触发器“;警告:递归调用或同步错误&引用;
我继承了一些Swift 3代码,它使用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
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都会发送一个与筛选器匹配的所有当前活动的流。是吗?是的,就是这样。