Работали ли вы напрямую с Core Data
Что проверяют
Трогали ли вы Core Data в живом приложении с фоновой синхронизацией или только в учебном списке дел. Ключевое, что слушают, это правило потоков и контекстов. Уточняют так: «как обновляете интерфейс, когда данные пришли из фонового импорта».
Как отвечать
Стройте ответ вокруг стека объектов:
NSPersistentContainer: модель, координатор и хранилище в одной обвязке,viewContextна главной очереди, фон черезperformBackgroundTaskилиnewBackgroundContext();- правило потоков:
NSManagedObjectживёт только в своём контексте и своей очереди, между контекстами передаётсяNSManagedObjectID, любой доступ внутриperform; - слияние изменений:
automaticallyMergesChangesFromParentнаviewContextи осознанно выбраннаяmergePolicy, иначе сохранение падает на конфликте; - наблюдение:
NSFetchedResultsControllerв UIKit,@FetchRequestв SwiftUI,NSPersistentHistoryTracking, если данные пишет расширение.
Дальше производительность, здесь и видно практику: fetchBatchSize и fetchLimit, relationshipKeyPathsForPrefetching против сотни мелких дозагрузок, NSBatchInsertRequest и NSBatchDeleteRequest для импорта. У пакетных запросов есть подвох: они идут мимо контекста, и изменения приходится вносить в него самому через историю изменений.
Про миграции: облегчённая проходит сама, если изменения выводимы автоматически, иначе нужна модель отображения, а с iOS 17 есть поэтапные миграции через NSStagedMigrationManager.
Напрямую не работали: честный вариант звучит так. В проекте был репозиторий поверх хранилища, я звал его методы, но модель контекстов понимаю.
Где спотыкаются
Передают NSManagedObject между потоками. Работает до первого фонового обновления, потом падает внутри Core Data с невнятным стеком.
Импортируют тысячи объектов в viewContext. Интерфейс замирает на несколько секунд, а вывод делается неверный: «Core Data медленная».
Считают Core Data базой данных и ищут в ней семантику SQL. Это графовый слой объектов поверх SQLite: отношения, каскадные удаления и валидация есть, произвольного соединения таблиц нет, а предикат, который SQLite не осилит, тихо досчитывается в памяти.