Есть ли способ предотвратить сохранение конкретного NSManagedObjectModel
на основе определенного условия?
Я знаю, что мы можем использовать willSave
для изменения объекта перед сохранением, но есть ли способ предотвратить сохранение объекта?
override public func willSave() {
if self.name != nil {
// Save the object into context
}
else {
// Don't save the object into context
}
}
Причина этого запроса заключается в том, что пользователь должен иметь возможность запустить форму и вставить некоторые значения, затем он также может перейти на другие экраны и сделать что-то еще, что может вызвать context.save()
и я не хочу, чтобы Форма для сохранения, если она не заполнена.
Мне нужно создать этот объект в контексте, так как объект имеет отношение к другому объекту в контексте, и если я создаю объект вне контекста, мне нужно будет изменить контекст для всех отношений.
Заранее спасибо.
Всего 2 ответа
Я понимаю, что вы упомянули, что не хотите использовать другой контекст, но использование другого контекста - лучший способ.
Если вы создаете в своем основном контексте, даже без сохранения, данные все еще находятся в «контексте». Выделение является самым безопасным. Создание дочернего контекста из вашего основного контекста ...
let childContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
childContext.parent = YOUR_MAIN_THREAD_CONTEXT
Теперь вы создаете NSManagedObject
с использованием этого дочернего контекста, и если пользователь уходит без завершения, просто установите для этого контекста значение nil, и его нет
Если вы хотите зафиксировать его, сохраните дочерний контекст, который передает его в main , затем сохраните основной контекст, чтобы отправить его в постоянное хранилище.
func commitContext(childContext: NSManagedObjectContext?) {
do {
try childContext?.save()
do {
try MainThreadMoc.save()
} catch {
print("Error saving parent context")
}
} catch {
print("Error saving childContext")
}
}
Если контекст не имеет незафиксированных изменений при представлении формы, вы можете использовать API отката () . Это
удаляет все из стека отмены, отбрасывает все вставки и удаления и восстанавливает обновленные объекты до их последних зафиксированных значений.
override public func willSave() {
if self.name != nil {
try? context.save()
}
else {
context.rollback()
}
}