CoreStore создает объект в контексте без сохранения в базе данных - PullRequest
0 голосов
/ 02 мая 2019

Я хочу решить следующую проблему:

Я хотел бы поработать с некоторыми NSManagedObject в контексте и изменить некоторые свойства во время выполнения, но не сообщая SQLite о каких-либо изменениях в нем.

Я просто хочу сохранить NSManagedObject в базе данных, когда нажму кнопку «Сохранить» или подобное.

Как я выяснил из демонстрации исходного кода, нам нужно использовать beginUnsafe для этих целей (возможно, я ошибаюсь)

func unstoredWorkout() -> WorkoutEntity {

    let transaction = CoreStore.beginUnsafe()
    let workout = transaction.create(Into<WorkoutEntity>())

    return workout
}

let workout = unstoredWorkout()
workout.muscles = []

Теперь, когда я пытаюсь обновить workout.muscles = [] приложение вылетает с ошибкой:

error: Mutating a managed object 0x600003f68b60 <x-coredata://C00A3E74-AC3F-47FD-B656-CA0ECA02832F/WorkoutEntity/tC3921DAE-BA43-45CB-8271-079CC0E4821D82> (0x600001c2da90) after it has been removed from its context.

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

1 Ответ

1 голос
/ 02 мая 2019

Причиной сбоя является то, что ваша транзакция живет только в вашем методе unstoredWorkout (), поэтому он вызывает deinit, который сбрасывает контекст (и удаляет все несохраненные объекты).Вы должны сохранить эту небезопасную транзакцию где-нибудь, чтобы сохранить ваш объект живым - например, в viewcontroller, который в конечном итоге сохранит изменения.

Но я бы посоветовал вам подумать об этом, если вы действительно хотите это сделать.Вы можете столкнуться с другими проблемами синхронизации с различным контекстом или другими действующими асинхронными транзакциями, например, когда задействованы вызовы API.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...