Что такое контекст в Core Data
Что проверяют
Понимаете ли вы, что NSManagedObjectContext это не «доступ к базе», а рабочая область в памяти со своим графом объектов, учётом изменений и жёсткими правилами по потокам. За вопросом стоит умение разводить работу между интерфейсным и фоновым контекстами.
Как отвечать
Контекст это черновик: через него объекты достают, меняют, создают и удаляют, и всё это живёт в оперативной памяти до вызова save. Контекст ведёт списки вставленных, изменённых и удалённых объектов, гарантирует единственность объекта с данным идентификатором внутри себя и умеет откатывать правки через rollback или undo.
Дальше про архитектуру. Контейнер хранилища даёт viewContext, привязанный к главной очереди, и фоновый контекст для тяжёлых операций. Обращаться к контексту и его объектам можно только из его очереди, то есть внутри perform или performAndWait. Между контекстами передают не объекты, а NSManagedObjectID.
Сохранение фонового контекста уходит в координатор хранилища, а в viewContext изменения попадают через автоматическое слияние или уведомление. У вложенных контекстов save ребёнка отдаёт правки только родителю, до диска они дойдут после сохранения родителя. Конфликты разруливает выбранная политика слияния.
Полезно добавить, что объекты приходят в контекст заготовками: свойства подтягиваются с диска при первом обращении, поэтому выборка дешёвая, а обход тысячи объектов в цикле внезапно дорогой.
Где спотыкаются
Трогают контекст из произвольного потока. Падает не сразу и не в том месте, поэтому стоит упомянуть флаг проверки многопоточности, который включают в схеме запуска.
Считают, что save в фоне сам обновит экран. Без слияния изменений или без контроллера выборки интерфейс продолжает показывать старый граф объектов.
Держат один контекст на всё приложение и импортируют в него десятки тысяч записей. Память растёт, главная очередь замирает: импорт идёт в фоновом контексте пачками, с сохранением и сбросом контекста после каждой.