Come implementare il setter personalizzato per NSManagedObject
in Swift. Devo eseguire un'attività prima di impostare la proprietà NSMangedObject
.Swift: Setter personalizzato per CoreData NSManagedObject
risposta
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
}
}
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
}
}
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. –
@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. –
In particolare questo risolto il problema 'opzioni: NSKeyValueObservingOptions.New | NSKeyValueObservingOptions.Old'. Grazie. – Hokage
Penso che l'approccio KVO si disintegrerà se NSManagedObject si trasforma in errore. – Andy