一个模型如何通知另一个模型特定 属性 发生了变化?
How one model can notify another model for specific property has changed?
Context,一个使用 UIKit 和 MVC 的 iOS 应用程序。
模型 A 有一个单例对象,其 属性 值之一(在本例中为 foo
)可以在运行时更改。 模型 B 有一个 属性,模型 C,使用模型 A 的 属性 值初始化。
class ModelA {
private(set) var foo: CustomObjectClassName
static let shared = ModelA()
}
class ModelB {
private var bar: ModelC
init() {
self.bar = ModelC(ModelA.shared.foo)
}
// TODO: Observer `foo` value change in Model A and then
// reinit ModelC to replace the old `bar` object
}
应该使用什么通用设计模式或机制让模型 B 了解模型 A 中的 属性 更改并重新初始化它自己的 属性?
我找到了两个可以使用的模式;然而,我对它们的了解越多,它们似乎是为模型和控制器之间的通信而设计的。
- NotificationCenter(通知和观察者)
- 键值观察
相关信息
感谢 El Tomato 的评论,委托可以作为一种模式使用。
委托模式会起作用,因为在我的例子中,模型 A 仅由单个实体模型 B 使用。
protocol ModelADelegate {
func fooDidChange() -> Void
}
class ModelA {
public var delegate: ModelADelegate?
private(set) var foo: CustomObjectClassName {
didSet {
delegate.fooDidChange()
}
}
static let shared = ModelA()
}
class ModelB, ModelADelegate {
private var bar: ModelC
init() {
ModelA.shared.delegate = self
self.bar = ModelC(ModelA.shared.foo)
}
func fooDidChange() {
self.bar = ModelC(ModelA.shared.foo)
}
}
Context,一个使用 UIKit 和 MVC 的 iOS 应用程序。
模型 A 有一个单例对象,其 属性 值之一(在本例中为 foo
)可以在运行时更改。 模型 B 有一个 属性,模型 C,使用模型 A 的 属性 值初始化。
class ModelA {
private(set) var foo: CustomObjectClassName
static let shared = ModelA()
}
class ModelB {
private var bar: ModelC
init() {
self.bar = ModelC(ModelA.shared.foo)
}
// TODO: Observer `foo` value change in Model A and then
// reinit ModelC to replace the old `bar` object
}
应该使用什么通用设计模式或机制让模型 B 了解模型 A 中的 属性 更改并重新初始化它自己的 属性?
我找到了两个可以使用的模式;然而,我对它们的了解越多,它们似乎是为模型和控制器之间的通信而设计的。
- NotificationCenter(通知和观察者)
- 键值观察
相关信息
感谢 El Tomato 的评论,委托可以作为一种模式使用。
委托模式会起作用,因为在我的例子中,模型 A 仅由单个实体模型 B 使用。
protocol ModelADelegate {
func fooDidChange() -> Void
}
class ModelA {
public var delegate: ModelADelegate?
private(set) var foo: CustomObjectClassName {
didSet {
delegate.fooDidChange()
}
}
static let shared = ModelA()
}
class ModelB, ModelADelegate {
private var bar: ModelC
init() {
ModelA.shared.delegate = self
self.bar = ModelC(ModelA.shared.foo)
}
func fooDidChange() {
self.bar = ModelC(ModelA.shared.foo)
}
}