2014-09-08 13 views

risposta

7

La mia raccomandazione sarebbe quella di utilizzare KVC. Forse non la soluzione più elegante, ma concepzionalmente un'applicazione logica di KVC.

Osservare una modifica dell'attributo. Registrarsi per la modifica in init(entity:insertIntoManagedObjectContext:) o meglio in awakeFromFetch e awakeFromInsert e rimuovere l'osservatore in 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 
    } 

} 

aggiornato per 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

In particolare questo risolto il problema 'opzioni: NSKeyValueObservingOptions.New | NSKeyValueObservingOptions.Old'. Grazie. – Hokage

+0

Penso che l'approccio KVO si disintegrerà se NSManagedObject si trasforma in errore. – Andy

6

V'è anche un modo più semplice come farlo senza riuscire abbonamento KVO. Esso può essere fatto semplicemente sovrascrivendo didChangeValueForKey: come questo:

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

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

Ho usato anche questo, sfortunatamente quando guardi la documentazione noterai un 'Non devi ignorare questo metodo. Avvertimento. Quindi immagino che questo potrebbe probabilmente avere degli effetti inaspettati. –

+1

@erikAigner che è vero. Sto usando questo approccio da un po 'di tempo e credo che l'avvertenza nella documentazione sia principalmente per problemi di prestazioni, poiché l'intero KVO/KVC sta trasmettendo questo metodo (insieme a 'willChangeValueForKey:'). La risposta accettata che suggerisce KVO ha le stesse caratteristiche di prestazione di questa. Finora non ho trovato un solo inaspettato effetti collaterali dell'utilizzo di questo approccio. –

Problemi correlati