我正在一个Struct模型对象上实现观察者设计模式。我的想法是将模型向下传递给一系列UIViewController,每个控制器修改它时,先前的控制器也会使用对象的更改进行更新。
我知道这个问题可以通过使用类而不是struct来解决,并直接通过引用修改对象,但我正在尝试了解更多关于使用structs的知识。
简单来说,我的模型对象通过调用
我现在的问题是内存访问:当
我该如何解决这个内存访问问题?
我知道这个问题可以通过使用类而不是struct来解决,并直接通过引用修改对象,但我正在尝试了解更多关于使用structs的知识。
struct ModelObject {
var data: Int = 0 {
didSet {
self.notify()
}
}
private var observers = [ModelObserver]()
mutating func attachObserver(_ observer: ModelObserver){
self.observers.append(observer)
}
private func notify(){
for observer in observers {
observer.modelUpdated(self)
}
}
}
protocol ModelObserver {
var observerID: Int { get }
func modelUpdated(_ model: ModelObject)
}
class MyViewController : UIViewController, ModelObserver {
var observerID: Int = 1
var model = ModelObject()
override func viewDidLoad() {
self.model.attachObserver(self)
self.model.data = 777
}
func modelUpdated(_ model: ModelObject) {
print("received updated model")
self.model = model //<-- problem code
}
}
简单来说,我的模型对象通过调用
notify()
通知任何观察者data
发生了更改。我现在的问题是内存访问:当
data
被设置为777
时,self.model
变为独占访问状态,当它调用notify
方法并最终调用modelUpdated
和self.model = model
时,我们会遇到一个错误:Simultaneous accesses to 0x7fd8ee401168, but modification requires exclusive access.
我该如何解决这个内存访问问题?