在Cocoa中观察数据变化的最佳方法是什么

时间:2018-10-25 04:06:54

标签: swift cocoa

我有一个单例存储我的macOS应用程序的一些全局数据,我的一个ViewController不断修改数据。我想同时显示与另一个ViewController相关的View中的更改。最好的方法是什么?

全局数据:

final class AppData {

    static var logs: [LogData] = []
}

ViewController 1:

class FirstViewController: NSViewController {

   AppData.logs.append(newLogData)
}

ViewController 2:

class SecondViewController: NSViewController {

   // what's the best way to simultaneously watch the change of AppData.logs? 
}

3 个答案:

答案 0 :(得分:1)

如果您的应用仅计划为macOS,则可以使用NSObjectController。这绝对是最简单的方法,您可以在“接口”构建器中进行大多数配置。它在内部与绑定一起使用。如果要观察数组,可以使用NSArrayController。

答案 1 :(得分:0)

一种方法是使用通知中心

在viewcontroller2中添加:

override func viewDidLoad() {
    super.viewDidLoad()

    notificationCenter.default.addObserver(self,
        selector: #selector(view1DidChange),
        name: "view1DidChange",
        object: nil
    )
}

@objc private func view1DidChange(_ notification: Notification) {
     // Do something
}

在viewcontroller1中添加

        notificationCenter.default.post(name: "view1DidChange", object: self)

这可以在每个应该听的课上重复。

答案 2 :(得分:0)

在这里,我分享了“代理和协议”方法来实现此功能。

final class AppData {

    static var logs: [LogData] = []
}

    protocol FirstViewControllerDelegate {
        func ViewControllerDelegate(appData:[LogData])
    }

    class FirstViewController: NSViewController {
        var delegate:FirstViewControllerDelegate?

        override func viewDidLoad() {
            super.viewDidLoad()
            AppData.logs.append(newLogData)
            self. delegate?.ViewControllerDelegate(appData: AppData.logs)

        }
    }

    class SecondViewController: NSViewController,FirstViewControllerDelegate {
        var firstViewController:FirstViewController = FirstViewController()
        override func viewDidLoad() {
            self.firstViewController.delegate = self
        }
        func ViewControllerDelegate(appData:[LogData]){
            //Do Update the UI
        }
    }