Основные данные предотвращают сохранение - PullRequest
1 голос
/ 15 января 2020

Есть ли способ предотвратить сохранение указанного c NSManagedObjectModel на основе указанного условия c?

Я знаю, что мы можем использовать willSave для изменения объекта перед сохранением, но Есть ли способ предотвратить сохранение объекта?

override public func willSave() {

    if self.name != nil {

       // Save the object into context
    }
    else {
       // Don't save the object into context
    }
}

Причина этого запроса в том, что пользователь должен иметь возможность запустить форму и вставить некоторые значения, тогда он также может go на другие экраны и делать что-то еще, что может вызвать context.save(), и я не хочу, чтобы форма сохранялась, если она не завершена.

Мне нужно создать этот объект в контексте, так как объект имеет отношения с другим объектом в контексте, и если я создаю объект вне контекста, мне нужно будет изменить контекст для всех отношений.

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 15 января 2020

Я понимаю, что вы упомянули, что не хотите использовать другой контекст, но использование другого контекста - это лучший способ.

Если вы создаете в главном контексте, даже без сохранения, данные все еще находятся «в контексте». Выделение является самым безопасным. Создание дочернего контекста из вашего основного контекста ...

let childContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)

childContext.parent = YOUR_MAIN_THREAD_CONTEXT

теперь вы создаете свой NSManagedObject с использованием этого дочернего контекста, и если пользователь уходит без завершения, просто установите для этого контекста значение nil и его нет.

Если вы хотите зафиксировать его, сохраните дочерний контекст, который переносит его в main , затем сохраните основной контекст в pu sh в постоянное хранилище

func commitContext(childContext: NSManagedObjectContext?) {

    do {
        try childContext?.save()
        do {
            try MainThreadMoc.save()
        } catch {
            print("Error saving parent context")
        }
    } catch {
        print("Error saving childContext")
    }
}
0 голосов
/ 15 января 2020

Если контекст не имеет незафиксированных изменений при представлении формы, вы можете использовать rollback () API. Он

удаляет все из стека отмены, отбрасывает все вставки и удаления и восстанавливает обновленные объекты до их последних принятых значений.

override public func willSave() {

    if self.name != nil {
       try? context.save()
    }
    else {
       context.rollback()
    }
}
...