【问题标题】:How one model can notify another model for specific property has changed?一个模型如何通知另一个模型特定属性发生了变化?
【发布时间】:2021-08-18 03:47:02
【问题描述】:

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 中的属性更改并重新初始化自己的属性?

我发现了两种可以使用的模式;然而,我对它们的了解越多,它们似乎是为模型和控制器之间的通信而设计的。

  • 通知中心(通知和观察员)
  • 键值观察

相关信息

【问题讨论】:

  • 使用属性观察者和委托调用?

标签: ios swift nsnotificationcenter key-value-observing


【解决方案1】:

感谢 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)    
    }
}

【讨论】:

  • ModelC 是否有其他属性可供 ModelB 的实例更改,或者所有 ModelC 对象都相同?
  • 模型 C 包含一个属性,模型 A
  • 那为什么它是ModelB的一个属性,如果所有的实例都完全一样,为什么不让它成为单例的属性来节省一些内存呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-01
  • 2017-08-28
  • 1970-01-01
  • 2018-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多