Что такое Core Data в iOS/macOS?

Ответ

Core Data — это фреймворк Apple для управления объектной моделью и сохранения данных, а не просто ORM. Он работает с графом объектов, обеспечивая валидацию, откат изменений, миграцию схемы и синхронизацию (включая iCloud).

Ключевые компоненты:

  • NSManagedObjectModel — описывает схему данных (сущности, атрибуты, связи).
  • NSPersistentStoreCoordinator — связывает модель с хранилищем (SQLite, XML, бинарное, in-memory).
  • NSManagedObjectContext — «рабочая область» для создания, изменения и удаления управляемых объектов.

Пример сохранения:

let context = persistentContainer.viewContext
let newUser = User(context: context)
newUser.name = "John"
do {
    try context.save()
} catch {
    print("Ошибка сохранения: (error)")
}

Преимущества:

  • Нативная интеграция с Cocoa-биндингами и NSFetchedResultsController.
  • Ленивая загрузка объектов и автоматическое управление faulting.
  • Встроенная поддержка Undo/Redo.

Недостатки:

  • Сложность настройки для нереляционных структур.
  • Производительность на очень больших наборах данных может требовать тонкой настройки.
  • Многопоточность требует использования отдельных контекстов (NSManagedObjectContext).

Ответ 18+ 🔞

Ну ты смотри, какой зверь этот Core Data, а! Это ж не какая-нибудь простецкая ORM-ка, которую любой школяр на коленке напишет. Это, блядь, целая вселенная от Apple для того, чтобы твои данные не разбежались как тараканы, а сидели в графе объектов, как в тюрьме строгого режима. Тут тебе и валидация, и откат, если накосячил, и миграция схемы — чтоб не пришлось всё с нуля строить, когда модель поменяешь. А уж про iCloud я молчу — это отдельная песня, ебать мои старые костыли.

Из чего же, из чего же этот зверь собран?

  • NSManagedObjectModel — это типа главный архитектор, который чертит схему: какие сущности, какие у них атрибуты и кто с кем связан. Без этой бумажки ты нихуя не построишь.
  • NSPersistentStoreCoordinator — это прораб, который связывает чертежи (Model) с реальными материалами — будь то SQLite, XML или просто память. Он знает, куда и как всё складывать.
  • NSManagedObjectContext — а это уже наша рабочая площадка, чертёжный стол. Здесь мы создаём, меняем и удаляем объекты. Пока не скажешь save(), всё это — просто черновик в голове, который можно смять и выкинуть.

Вот, смотри, как нового юзера впихнуть в систему:

let context = persistentContainer.viewContext
let newUser = User(context: context)
newUser.name = "John"
do {
    try context.save()
} catch {
    print("Ошибка сохранения: (error)")
}

Видишь? Создали в контексте, имя присвоили и — бац — сохранили. Если что-то пошло не так, ошибку выплюнет, хитрая жопа.

Чем он хорош, этот Core Data?

  • С ним нативно дружит пол-экосистемы Apple: Cocoa-биндинги, NSFetchedResultsController — красота, а не жизнь.
  • Ленивая загрузка объектов — он не будет тащить из базы всё подряд, пока ты явно не попросишь. Сам решает, когда подгрузить, умная манда с ушами.
  • Undo/Redo из коробки — накосячил, откатился, как будто и не было.

А где подвох?

  • Попробуй запихнуть в него какую-нибудь нереляционную, замысловатую структуру — тут же упрёшься в стену сложности, ёперный театр.
  • Если данных овердохуища, производительность может просесть, придётся шаманить с настройками.
  • Многопоточность — это отдельный ад. Нельзя просто так взять и тыкать в один контекст из всех потоков. Нужно для каждого потока свой заводить, иначе пидары налетят в виде крешей.

В общем, инструмент мощный, но не для слабонервных. Разберёшься — будешь как бог данных, не разберёшься — будешь как Герасим, который только «Му-му» говорить может, когда всё горит.