Я понимаю, что вы упомянули, что не хотите использовать другой контекст, но использование другого контекста - это лучший способ.
Если вы создаете в главном контексте, даже без сохранения, данные все еще находятся «в контексте». Выделение является самым безопасным. Создание дочернего контекста из вашего основного контекста ...
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")
}
}