Настройка Core Data в iOS-приложении

TRUETECH занимается разработкой, поддержкой и обслуживанием мобильных приложений iOS, Android, PWA. Имеем большой опыт и экспертизу для публикации мобильных приложений в популярные маркеты Google Play, App Store, Amazon, AppGallery и другие.
Разработка и поддержка любых видов мобильных приложений:
Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

Это лишь некоторые из типы мобильных приложений, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента.

Предлагаемые услуги
Показано 1 из 1 услугВсе 1735 услуг
Настройка Core Data в iOS-приложении
Средняя
~2-3 рабочих дня
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    756
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    624
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1052
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    947
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    862
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    445

Настройка Core Data в iOS-приложении

Core Data — не просто обёртка над SQLite. Это граф объектов с ленивой загрузкой, кэшированием, отслеживанием изменений и возможностью синхронизации через CloudKit. При правильной настройке он ускоряет работу с локальными данными. При неправильной — вызывает дедлоки и crashes на NSFetchedResultsController.

Как настраиваем стек

Начиная с iOS 10 рекомендуемый способ — NSPersistentContainer. Он инкапсулирует NSManagedObjectModel, NSPersistentStoreCoordinator и основной NSManagedObjectContext.

lazy var persistentContainer: NSPersistentContainer = {
    let container = NSPersistentContainer(name: "DataModel")
    container.loadPersistentStores { _, error in
        if let error { fatalError("Core Data store failed: \(error)") }
    }
    container.viewContext.automaticallyMergesChangesFromParent = true
    container.viewContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
    return container
}()

automaticallyMergesChangesFromParent = true — критично. Без этого изменения, сохранённые в background context, не попадают автоматически в viewContext, и NSFetchedResultsController не обновляет UI.

Многопоточность — главная ловушка

NSManagedObject не thread-safe. Передавать объект между потоками нельзя — только objectID через NSManagedObjectID. В background context получаем копию объекта:

let backgroundContext = persistentContainer.newBackgroundContext()
backgroundContext.perform {
    let objectInBg = backgroundContext.object(with: objectID)
    // изменяем objectInBg
    try? backgroundContext.save()
}

Самый частый краш: EXC_BAD_ACCESS или NSInternalInconsistencyException при доступе к NSManagedObject не в его потоке. Instruments → Core Data template показывает, где это происходит.

performAndWait vs perform. perform — асинхронный, performAndWait — синхронный и может вызвать дедлок, если вызвать из main thread с ожиданием background context, который в свою очередь ждёт main. Используем perform для фонового сохранения.

NSFetchedResultsController и diffable data source

NSFetchedResultsController отслеживает изменения в Core Data и сообщает делегату. Связка с UICollectionViewDiffableDataSource работает через controllerDidChangeContent:

func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
    var snapshot = NSDiffableDataSourceSnapshot<Section, NSManagedObjectID>()
    snapshot.appendSections([.main])
    snapshot.appendItems(controller.fetchedObjects?.map(\.objectID) ?? [])
    dataSource.apply(snapshot, animatingDifferences: true)
}

Используем objectID в snapshot, не сам NSManagedObject — иначе diffable source не может корректно сравнивать объекты.

Миграции

При изменении модели данных нужна миграция. Лёгкая миграция (NSInferMappingModelAutomatically) работает для добавления/удаления атрибутов. Для переименований, изменения типов — кастомная migration policy через NSEntityMigrationPolicy. Без правильной миграции loadPersistentStores вернёт ошибку NSMigrationError, и приложение не запустится.

В конфигурации добавляем:

container.persistentStoreDescriptions.first?.shouldMigrateStoreAutomatically = true
container.persistentStoreDescriptions.first?.shouldInferMappingModelAutomatically = true

CloudKit синхронизация

NSPersistentCloudKitContainer вместо NSPersistentContainer включает синхронизацию через iCloud CloudKit. Требует: iCloud Entitlement, CloudKit capability в Xcode, модель без некоторых типов атрибутов (Binary Data с External Storage не синхронизируется автоматически).

Конфликты при синхронизации разрешаются через mergePolicyNSMergeByPropertyObjectTrumpMergePolicy обычно правильный выбор.

Что входит в работу

  • Создание .xcdatamodeld с entity и relationships
  • Настройка NSPersistentContainer с правильными параметрами контекста
  • Background context для импорта и записи данных
  • NSFetchedResultsController для отображения данных в UI
  • Стратегия миграции для будущих изменений модели
  • Опционально: CloudKit синхронизация

Сроки

Базовый стек с одной-двумя сущностями и NSFetchedResultsController: 1 день. Со сложной моделью, миграциями, background sync и CloudKit интеграцией: 2–3 дня. Стоимость рассчитывается после анализа требований к данным.