Выбор ответа Middle Сеть, Codable и хранение обновлено

Core Data и потоки

Вопрос

Как правильно сохранить тысячу объектов в Core Data, не блокируя интерфейс?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Фоновым контекстом: container.performBackgroundTask { ... save() }. NSManagedObjectContext и его объекты привязаны к своей очереди: работать с ними можно только внутри perform.

Варианты ответа

  1. Работать с viewContext из DispatchQueue.global(), чтобы не грузить главный поток
  2. Передать NSManagedObject из главного контекста в фоновый поток и сохранить там
  3. Отключить automaticallyMergesChangesFromParent, чтобы слияние не тормозило
  4. Фоновым контекстом: container.performBackgroundTask { ... save() }правильный ответ

Разбор

NSManagedObjectContext и его объекты привязаны к своей очереди: работать с ними можно только внутри perform. Фоновый контекст выполняет импорт на своей очереди, а viewContext с automaticallyMergesChangesFromParent = true подхватит изменения. Использовать viewContext из другого потока это гонка и случайные крэши. Объекты между контекстами передают через objectID. Отключение слияния приведёт к устаревшим данным в UI.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.