Как реализовать пользовательский сеттер для NSManagedObject
в Swift. Мне нужно выполнить задачу перед установкой свойства NSMangedObject
.Swift: Пользовательский сеттер для CoreData NSManagedObject
ответ
Моей рекомендацией было бы использовать KVC. Возможно, это не самое элегантное решение, но концептуально логическое приложение KVC.
Наблюдать за изменением атрибута. Зарегистрируйтесь для изменения в init(entity:insertIntoManagedObjectContext:)
или, может быть, лучше в awakeFromFetch
и awakeFromInsert
, и удалите наблюдателя в 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
}
}
Обновление для 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
}
}
Существует даже более простой способ, как сделать это без управления подпиской КВО. Это может быть сделано просто перекрывая didChangeValueForKey:
так:
override func didChangeValueForKey(key: String) {
super.didChangeValueForKey(key)
if key == "propertyName" {
// do something now when propertyName changed
}
}
Я также использовал это, к сожалению, когда вы смотрите на документацию, вы заметите предупреждение «Вы не должны переопределять этот метод». Поэтому я предполагаю, что это может иметь некоторые неожиданные последствия. –
@erikAigner это правда. Я использую этот подход довольно долгое время, и я считаю, что предупреждение в документации в основном относится к проблемам производительности, поскольку весь KVO/KVC ретранслирует этот метод (вместе с 'willChangeValueForKey:'). Принятый ответ, предполагающий, что KVO имеет те же рабочие характеристики, что и этот. До сих пор я не нашел ни одного неожиданного побочного эффекта от использования этого подхода. –
- 1. Swift CoreData Подкласс NSManagedObject
- 2. Swift: CoreData NSManagedObject Префикс подкласса
- 3. Swift CoreData фон NSManagedObject Fault
- 4. Swift - NSManagedObject CoreData в подклассе
- 5. Swift - Пользовательский сеттер по свойству
- 6. CoreData: расширения NSManagedObject
- 7. Пользовательский конструктор подкласса NSManagedObject
- 8. CoreData NSManagedObject поврежден
- 9. Сохранение CoreData NSManagedObject new
- 10. CoreData NSManagedObject не обновляется
- 11. CoreData - Преимущества подкласса NSManagedObject
- 12. странное поведение CoreData NsManagedObject
- 13. swift - JSON to NSManagedObject
- 14. NSManagedObject описание в Swift
- 15. CoreData NSManagedObject Swift sublcass с зарезервированным ключевым словом
- 16. CoreData: подготовиться к segue Проблема NSManagedObject в Swift 3
- 17. Ошибка iPhone Coredata (NSMergeConflict для NSManagedObject)
- 18. Swift CoreData: Не удалось вызвать назначенный инициализатор на NSManagedObject
- 19. CoreData: Доступ к экземпляру NSManagedObject
- 20. IOS Swift - deletedObjects NSManagedObject
- 21. Пользовательский установщик NSManagedObject в категории
- 22. CoreData не может правильно «создать подкласс NSManagedObject» Swift
- 23. Поиск идентичного NSManagedObject в CoreData
- 24. swift Ошибка инициализации подкласса NSManagedObject
- 25. Coredata in swift
- 26. Swift NSOderedSet Итерирование для доступа Атрибуты - CoreData
- 27. CoreData with Swift
- 28. CoreData, создающий подкласс NSManagedObject с родительским объектом
- 29. получить последний добавленный NSManagedObject из CoreData
- 30. Как сохранить пользовательский объект с помощью CoreData в Swift?
В частности, это решить мою проблему 'варианты: NSKeyValueObservingOptions.New | NSKeyValueObservingOptions.Old'. Благодарю. – Hokage
Я думаю, что подход KVO развалится, если NSManagedObject превратится в неисправность. – Andy