Основные данные предотвращают сохранение

Есть ли способ предотвратить сохранение конкретного 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()
    }
}

Есть идеи?

10000