如何观察来自2个不同视图控制器的NSManagedObject记录的更改?
基本上我有一个masterview控制器,有3个容器在一个点上,我正在更新一个NSManagedObject实例:(Person.firstName =“Ehab”)!如何观察来自2个不同视图控制器的NSManagedObject记录的更改?
在另外两个容器中有一个属性[Person] &另一个有属性[Person:String] &这两个集合属性都有记录已被更改。
我在找的是当我更改(Person.firstName =“taylor”)时,我需要其他2个类如何通知数组和字典才能发生变化!
一种方法是使用NotoficationCenter并传递UserInfo中的修改对象。但有没有更简单的方法来做到这一点?
听NSManagedObjectContextObjectsDidChangeNotification是最常见方式,最简单的方法被通知从的NSManagedObjectContext变化。 您可以从userInfo字典中提取插入,删除或在您的情况下更新的对象。
但请注意,只有当NSManagedObjectContext保存时才会通知您。
显然,您必须在所有视图控制器中注册此通知,以在其中管理对象并处理这些视图控制器中的通知。有大量关于此在线文档和Apple文档/示例代码的文档。
我觉得你是什么建议这可以通过** NSManagedObjectContextObjectsDidChangeNotification **!但我认为使用NotificationCenter仍然会变得简单或更具可读性。感谢您的答复!我明白:) –
是的,当然,你必须在通知中心注册这个通知。没问题。 – McNight
使用NSManagedObjectContextObjectsDidChange
在你的2个容器viewDidLoad
,添加一个观察者
override func viewDidLoad() {
super.viewDidLoad()
let notificationCenter = NotificationCenter.default
notificationCenter.addObserver(self, selector: #selector(managedObjectContextObjectsDidChange(_:)), name: Notification.Name.NSManagedObjectContextObjectsDidChange, object: yourManagedObjectContext)
@objc func managedObjectContextObjectsDidChange(_ notification: Notification){
guard let userInfo = notification.userInfo else {
return
}
if let updates = userInfo[NSUpdatedObjectsKey] as? Set<NSManagedObject> {
for update in updates {
if let person = update as? Person {
// update person info here
}
}
}
}
希望这有助于。
谢谢,帮助....想到我所做的是我设置了一个自定义通知,我通过我的更新对象“后,我保存了mangedContext”。然后我替换了那个。我认为这可能是我所拥有的更好的方法。 :) –
如何创建协议?例如,用func人员调用ChangeDelegate(_ didChange:Person)。通过使用此协议委托其他2容器... –
它不是一个坏主意,但我认为通知是在我的情况更好.. –