2014-09-08 13 views

Odpowiedz

7

Moja rekomendacja to użycie KVC. Być może nie jest to najbardziej eleganckie rozwiązanie, ale koncepcyjnie logiczna aplikacja KVC.

Obserwuj zmianę atrybutu. Zarejestruj się na zmianę w init(entity:insertIntoManagedObjectContext:) lub lepiej w awakeFromFetch i awakeFromInsert i usuń obserwatora z 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 
    } 

} 

Aktualizacja dla 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

Konkretnie to rozwiązać mój problem 'opcje: NSKeyValueObservingOptions.New | NSKeyValueObservingOptions.Old'. Dzięki. – Hokage

+0

Myślę, że podejście KVO rozpadnie się, jeśli NSManagedObject zamieni się w błąd. – Andy

6

Jest jeszcze prostszy sposób, jak to zrobić bez zarządzania subskrypcji KVO. Można to zrobić jedynie poprzez nadpisanie didChangeValueForKey: takiego:

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

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

Użyłem tego również, niestety, gdy spojrzysz na dokumentację, zauważysz ostrzeżenie "Nie możesz przesłonić tej metody". Sądzę więc, że może to mieć pewne nieoczekiwane efekty. –

+1

@erikAigner, który jest prawdziwy. Używam tego podejścia od dłuższego czasu i uważam, że ostrzeżenie w dokumentacji dotyczy głównie problemów związanych z wydajnością, ponieważ całe KVO/KVC przekazuje tę metodę (wraz z 'willChangeValueForKey:'). Przyjęta odpowiedź sugerująca, że ​​KVO ma taką samą charakterystykę wydajności jak ta. Do tej pory nie znalazłem żadnych nieoczekiwanych efektów ubocznych stosowania tego podejścia. –

Powiązane problemy