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. –
- 1. Memorizza ma non salvare NSManagedObject su CoreData?
- 2. estensione Swift sulla NSManagedObject per tornare instanceType
- 3. Swift: memorizzazione stati in CoreData con enumerazioni
- 4. Come assegnare la relazione molti-a-molti CoreData in Swift?
- 5. Swift: Fetch CoreData come Array
- 6. Ordinamento dei risultati CoreData utilizzando NSPredicate in Swift
- 7. Swift - Custom setter sulla proprietà
- 8. privato setter "set()" in Swift
- 9. CoreData Swift: come salvare e caricare i dati?
- 10. Problema con dati core di classe NSManagedObject personalizzati in swift
- 11. Recupero dell'elemento più recente da CoreData in Swift
- 12. Creare un setter Solo a Swift
- 13. Identificatore univoco per NSManagedObject
- 14. Estendere un metodo di eliminazione di NSManagedObject
- 15. Problema SQLCipher e CoreData: CoreData non è riuscito a risolvere un errore per
- 16. NSManagedObject Non compatibile con il protocollo in Swift
- 17. Linker personalizzato per progetto Xcode con swift
- 18. Segmento personalizzato in Swift
- 19. Swift ottiene specifici NSManagedObject dall'entità (dati di base)
- 20. Implementare CoreData in un progetto esistente usando Swift
- 21. Threading NSOperation e CoreData
- 22. Iniz. Personalizzata per sottoclasse NSManagedObject
- 23. CoreData errore "dati: <fault>"
- 24. Errore: CoreData: errore: Impossibile chiamare inizializzatore designato sulla NSManagedObject classe 'prodotto'
- 25. Nome attributo NSPredicate CoreData
- 26. Come salvare Array su CoreData?
- 27. CoreData rapporto restituisce un _NSCoreDataTaggedObjectID
- 28. Come eseguire una migrazione LightData CoreData in Swift
- 29. swift - Unit test CoreData (+ MagicalRecord) trigger di trigger EXC_BAD_ACCESS
- 30. Visualizzazione inserimento personalizzato in Swift
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