如何使用 属性 观察者在其他控制器中更新具有相同 属性 的 swift NSObject 模型?

How to update swift NSObject model having same property in other controllers using property observer?

我正在浏览 Apple 文档和一些教程,在这些教程中我了解到我们可以设置观察者,如果对象被修改,它将被调用。但我心中几乎没有疑问。

以下是模型收到有关 属性 更改通知的摘要:

假设有 3 个视图控制器,它们显示 Foo 个模型列表。 Foo 模型具有名为 idtitle 的属性。我的问题是,是否可以在其他控制器中收到通知 Foo 模型已修改,例如 id 10。这是否只有在 3 个控制器之间共享相同的模型实例时才有可能,或者我们可以实现它,尽管实例不同?

我正在寻找一个具体的解决方案,其中用户喜欢一个屏幕上的提要(类似于 Facebook),如果具有相同 ID 的提要在其他控制器中,则应通知该控制器该提要已修改,刷新其 UI。为了清楚起见,我附上了一张图片。

我不希望使用委托或通知模式,因为它可能会造成混乱,而观察者模式将是更合适的解决方案。

这是一个如何实现此目标的示例。

供稿模型:

class Feed: NSObject {
    var id: String
    @objc dynamic var isLiked = false

    init(id: String) {
        self.id = id
    }
}

任何你想观察的属性,标记它@objc dynamic,即Feed模型中的isLiked

class ListVC: UIViewController {
    let feed = Feed(id: "1")
    var observer: NSKeyValueObservation?

    override func viewDidLoad() {
        super.viewDidLoad()

    }

    @IBAction func openDetailVC(_ sender: UIButton) {
        if let detailVC = self.storyboard?.instantiateViewController(withIdentifier: "DetailVC") as? DetailVC {
            self.observer = detailVC.feed.observe(\.isLiked, options: [.new], changeHandler: { (feed, change) in
                if let newValue = change.newValue {
                    print(newValue)
                    //Reload the UI here...
                }
            })
            self.navigationController?.pushViewController(detailVC, animated: true)
        }
    }
}

下一个 ListVC 有一个 feed 属性。

viewDidLoad() 中向 feed 添加一个 observer。在 feed 中指定要观察的 属性,即 isLiked。每次 isLiked 属性.

发生变化时,都会调用观察者中的 closure

现在,DetailVC将会。

class DetailVC: UIViewController {
    let feed = Feed(id: "1")

    @IBAction func likeButtonPressed(_ sender: UIButton) {
        self.feed.isLiked = !self.feed.isLiked
    }
}

在上面的代码中,每当按下 likeButton 时,我都会更改 feedisLiked 属性 的值。