我继承了一些使用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以使用不同的队列(串行或并发调度)可以解决问题,但我不相信它是正确的解决方案。