2016-08-23 3 views
1

Я хочу, чтобы некоторые метки в моем представлении всегда отображали фактическое состояние свойств NSManagedObject.Изменения NSManagedObject отражают изменения на лету

Например, у меня есть firstNameLabel. Я заполняю его данными от NSManagedObject.firstName. Как обновить данные «на лету», если обновлено NSManagedObject? У меня есть множество таких ярлыков.

Я читал, что мне нужно следить за NSManagedObjectContextObjectsDidChangeNotification и проверять все изменения, если этот контекст, но это единственный способ сделать это, не проще ли нам? Как я буду проверять, что изменение было выполнено в NSManagedObject, который я хочу (например, если я изменил 1000 объектов, но мне нужно обновлять данные только с одного).

+1

Использование наблюдения ключ-значение, на OS X привязками ключ-значение. –

ответ

0

Решение:

var yourObject: YourManagedObjectClass! // here your example object 

override func viewDidLoad() { 
    // … your other init code 
    // don't forget to remove observer 

    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.objectContextObjectsDidChange(_:)), name: NSManagedObjectContextObjectsDidChangeNotification, object: yourObject.managedObjectContext) 
} 

/// Object did changed, let's look what had changed 
func objectContextObjectsDidChange(notification: NSNotification) { 
    guard let userInfo = notification.userInfo, 
     let updatedObjects = userInfo[NSUpdatedObjectsKey] as? Set<NSManagedObject> where updatedObjects.count > 0 else { return } 

    for object in updatedObjects { 
     if let updatedObject = object as? YourManagedObjectClass where updatedObject.objectID == yourObject.objectID { 
      // Data changed in our object, you can refresh your label here 
      // Don't forget about threads if your object wasn't in main context 

      label.text = updatedObject.text 
return 
     } 
    } 
}