Как лучше всего наблюдать за изменением данных в Какао? - PullRequest
0 голосов
/ 25 октября 2018

У меня есть одно хранилище для хранения глобальных данных для моего приложения MacOS, один из моих ViewController продолжает изменять данные.Я хочу одновременно показать изменения в View, который связан с другим ViewController.Каков наилучший способ сделать это?

Глобальные данные:

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 голосов
/ 25 октября 2018

Если ваше приложение предназначено только для macOS, вы можете использовать NSObjectController .Это, безусловно, самый простой подход, и вы можете выполнить большую часть конфигурации в Интерфейсном конструкторе.Он работает внутри с привязками.В случае массива, который вы хотите наблюдать, вы должны использовать NSArrayController.

0 голосов
/ 25 октября 2018

Здесь я делюсь подходом делегата и протокола для достижения этой функциональности.

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
        }
    }
0 голосов
/ 25 октября 2018

Один из способов - использовать центр уведомлений

В 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)

Это можно повторить в каждом классе, которыйдолжен слушать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...