2014-09-08 2 views

ответ

7

Моей рекомендацией было бы использовать KVC. Возможно, это не самое элегантное решение, но концептуально логическое приложение KVC.

Наблюдать за изменением атрибута. Зарегистрируйтесь для изменения в init(entity:insertIntoManagedObjectContext:) или, может быть, лучше в awakeFromFetch и awakeFromInsert, и удалите наблюдателя в willTurnIntoFault.

init(entity: NSEntityDescription!, insertIntoManagedObjectContext context: NSManagedObjectContext!) { 
    super.init(entity: entity, insertIntoManagedObjectContext: context) 
    addObserver(self, forKeyPath: "attribute", options: NSKeyValueObservingOptions.New | NSKeyValueObservingOptions.Old, context: nil) 
} 


override func observeValueForKeyPath(keyPath: String!, ofObject object: AnyObject!, change: NSDictionary!, context: CMutableVoidPointer) { 
    if (keyPath == "attribute") { 
      // do what you need to do 
    } 

} 

Обновление для Swift 3:

init(entity: NSEntityDescription!, insertIntoManagedObjectContext context: NSManagedObjectContext!) { 
    super.init(entity: entity, insertIntoManagedObjectContext: context) 
    addObserver(self, forKeyPath: "attribute", options: [.old, .new], context: nil) 
} 

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { 
    if keyPath == "attribute" { 
      // do what you need to do 
    } 
} 
+0

В частности, это решить мою проблему 'варианты: NSKeyValueObservingOptions.New | NSKeyValueObservingOptions.Old'. Благодарю. – Hokage

+0

Я думаю, что подход KVO развалится, если NSManagedObject превратится в неисправность. – Andy

6

Существует даже более простой способ, как сделать это без управления подпиской КВО. Это может быть сделано просто перекрывая didChangeValueForKey: так:

override func didChangeValueForKey(key: String) { 
    super.didChangeValueForKey(key) 

    if key == "propertyName" { 
     // do something now when propertyName changed 
    } 
} 
+2

Я также использовал это, к сожалению, когда вы смотрите на документацию, вы заметите предупреждение «Вы не должны переопределять этот метод». Поэтому я предполагаю, что это может иметь некоторые неожиданные последствия. –

+1

@erikAigner это правда. Я использую этот подход довольно долгое время, и я считаю, что предупреждение в документации в основном относится к проблемам производительности, поскольку весь KVO/KVC ретранслирует этот метод (вместе с 'willChangeValueForKey:'). Принятый ответ, предполагающий, что KVO имеет те же рабочие характеристики, что и этот. До сих пор я не нашел ни одного неожиданного побочного эффекта от использования этого подхода. –

Смежные вопросы