Как обновить swift модель NSObject с таким же свойством в других контроллерах с помощью свойства обозревателя? - PullRequest
2 голосов
/ 06 февраля 2020

Я просматривал документацию Apple и несколько уроков, где я узнал, что мы можем установить наблюдателя, который будет вызываться, если объект будет изменен. Но у меня мало сомнений.

Вот сводка, в которой модель уведомляется об изменениях свойства:

enter image description here

Предположим, есть 3 контроллера представления, и они показывают список Foo моделей. Модель Foo имеет свойства, называемые id и title. Мой вопрос заключается в том, возможно ли получать уведомления в других контроллерах о том, что модель Foo изменена, например, с id 10 . Возможно ли это только в том случае, если один и тот же экземпляр модели используется совместно тремя контроллерами, или мы можем достичь этого, хотя экземпляры разные?

Я ищу конкретное решение, в котором пользователю нравится канал (похожий на Facebook) на одном экране, и если канал с тем же идентификатором находится в другом контроллере, этот контроллер должен быть уведомлен об изменении этого канала, обновив sh его пользовательский интерфейс. Я приложил изображение для ясной идеи.

enter image description here

Я не wi sh до go с делегатом или шаблоном уведомления, поскольку это может создать хаос, скорее картина наблюдателя будет более правильным решением.

1 Ответ

1 голос
/ 06 февраля 2020

Вот пример того, как вы можете достичь этого.

Модель фида:

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

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

Любое свойство, которое вы хотите наблюдать, отметьте его @objc dynamic, т.е. isLiked в Feed модели.

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.

Добавьте observer к feed в viewDidLoad(). Укажите свойство, которое вы хотите наблюдать в feed, т.е. isLiked. closure в обозревателе будет вызываться каждый раз, когда происходит изменение свойства isLiked.

Теперь DetailVC будет.

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

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

В приведенном выше коде Я изменяю значение свойства isLiked в feed всякий раз, когда нажимается likeButton.

...