Выбор ответа Middle Сеть, Codable и хранение обновлено
Core Data и потоки
Вопрос
Как правильно сохранить тысячу объектов в Core Data, не блокируя интерфейс?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Фоновым контекстом: container.performBackgroundTask { ... save() }. NSManagedObjectContext и его объекты привязаны к своей очереди: работать с ними можно только внутри perform.
Варианты ответа
- Работать с
viewContextизDispatchQueue.global(), чтобы не грузить главный поток - Передать
NSManagedObjectиз главного контекста в фоновый поток и сохранить там - Отключить
automaticallyMergesChangesFromParent, чтобы слияние не тормозило - Фоновым контекстом:
container.performBackgroundTask { ... save() }правильный ответ
Разбор
NSManagedObjectContext и его объекты привязаны к своей очереди: работать с ними можно только внутри perform. Фоновый контекст выполняет импорт на своей очереди, а viewContext с automaticallyMergesChangesFromParent = true подхватит изменения. Использовать viewContext из другого потока это гонка и случайные крэши. Объекты между контекстами передают через objectID. Отключение слияния приведёт к устаревшим данным в UI.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «Сеть, Codable и хранение»
- App Transport Security
- Свой init(from:) в Codable
- HTTP-кеш в URLSession
- Доступность элементов Keychain
- Задача на Swift: повтор запроса с экспоненциальной задержкой
- Один битый элемент ломает весь массив
- Какое хранилище выбрать на iOS
- Отсутствующее поле при декодировании