如何使用 属性 观察者在其他控制器中更新具有相同 属性 的 swift NSObject 模型?
How to update swift NSObject model having same property in other controllers using property observer?
我正在浏览 Apple 文档和一些教程,在这些教程中我了解到我们可以设置观察者,如果对象被修改,它将被调用。但我心中几乎没有疑问。
以下是模型收到有关 属性 更改通知的摘要:
假设有 3 个视图控制器,它们显示 Foo
个模型列表。 Foo
模型具有名为 id
和 title
的属性。我的问题是,是否可以在其他控制器中收到通知 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
时,我都会更改 feed
中 isLiked
属性 的值。
我正在浏览 Apple 文档和一些教程,在这些教程中我了解到我们可以设置观察者,如果对象被修改,它将被调用。但我心中几乎没有疑问。
以下是模型收到有关 属性 更改通知的摘要:
假设有 3 个视图控制器,它们显示 Foo
个模型列表。 Foo
模型具有名为 id
和 title
的属性。我的问题是,是否可以在其他控制器中收到通知 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
时,我都会更改 feed
中 isLiked
属性 的值。