Jak zaimplementować niestandardowy seter dla NSManagedObject
w Swift. Muszę wykonać zadanie przed ustawieniem właściwości NSMangedObject
.Swift: Custom Setter dla CoreData NSManagedObject
Odpowiedz
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
}
}
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
}
}
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. –
@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. –
- 1. Swift - Custom setter on property
- 2. Swift: CoreData i ogólny NSOrderedSet
- 3. Swift CoreData DictionaryResultType odlew
- 4. Custom Segue w Swift
- 5. Jak generować klasy NSManagedObject w Objective C zamiast Swift?
- 6. Pobieranie najnowszego elementu z CoreData w Swift
- 7. Jak przypisać w Swift relację wiele-do-wielu CoreData?
- 8. CoreData - jak stworzyć podklasę podklasy NSManagedObject (Generation Gap pattern)
- 9. Jak zaktualizować wpis CoreData, który został już zapisany w Swift?
- 10. Jak zrobić wyznaczonego inicjatora dla podklasy NSManagedObject w Swift?
- 11. Subclassing NSManagedObject z Swift 3 i Xcode 8 beta
- 12. Jak wykonać lekką migrację CoreData w Swift
- 13. związek CoreData zwraca _NSCoreDataTaggedObjectID
- 14. Użyj klasy NSManagedObject bez initWithEntity :?
- 15. Niepoprawna redeclaration na klasach CoreData
- 16. keyPathsForValuesAffecting z NSManagedObject
- 17. Swift pobiera określony obiekt NSManagedObject z obiektu (dane podstawowe)
- 18. Rozwiązywanie "Nie można wywołać określonego inicjalizatora w klasie NSManagedObject"
- 19. Drukowanie podrzędnego obiektu Core Data obiektu NSManagedObject do konsoli zwraca pustą linię w Swift
- 20. Lambda dla getter i setter własności
- 21. Nazwa atrybutu NSPredicate CoreData
- 22. Zapisz obiekt w CoreData
- 23. CoreData: błąd: nie udało się wywołać określonego inicjalizatora w klasie NSManagedObject
- 24. Błąd: CoreData: error: Nie można nazwać wyznaczony inicjator na NSManagedObject klasy 'produkt'
- 25. Sortowanie według CoreData dla wielu osób
- 26. Co to jest odpowiednik coredata dla Androida
- 27. Wiązanie właściwości Custom Control Dependency
- 28. Jak zdobyć obiekty po połączeniu CoreData Context
- 29. Custom Rehediler (RX) Custom Scheduler C#
- 30. Keras Custom Metric dla pojedynczej dokładności klasy
Konkretnie to rozwiązać mój problem 'opcje: NSKeyValueObservingOptions.New | NSKeyValueObservingOptions.Old'. Dzięki. – Hokage
Myślę, że podejście KVO rozpadnie się, jeśli NSManagedObject zamieni się w błąd. – Andy