В чем разница между Realm и Core Data в iOS?

«В чем разница между Realm и Core Data в iOS?» — вопрос из категории Базы данных, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Realm — это кроссплатформенная объектно-ориентированная база данных (NoSQL), а Core Data — фреймворк Apple для управления графом объектов с возможностью сохранения состояния (persistence).

Основные отличия

Критерий Realm Core Data
Архитектура Объектная база данных Фреймворк для управления объектным графом и persistence
Производительность Часто быстрее при операциях чтения/записи, особенно с большими данными Может быть медленнее, зависит от настройки (SQLite, XML, in-memory)
API и простота Более простой и интуитивный API, меньше boilerplate-кода Более сложный, требует настройки контекстов (NSManagedObjectContext), моделей
Многопоточность Объекты автоматически обновляются между потоками, потокобезопасны по умолчанию Требует ручного управления контекстами (perform блоки, mergeChanges)
Кроссплатформенность Поддерживает iOS, Android, macOS, другие платформы Экосистема Apple (iOS, macOS, tvOS, watchOS)
Схема данных Динамическая, миграции часто проще Строгая, требует версионирования модели и миграций

Пример кода

Realm: Создание и сохранение объекта

// 1. Определение модели
class Dog: Object {
    @Persisted var name = ""
    @Persisted var age = 0
}

// 2. Операция записи
let realm = try! Realm()
try! realm.write {
    let myDog = Dog()
    myDog.name = "Rex"
    myDog.age = 3
    realm.add(myDog)
}

Core Data: Создание и сохранение объекта

// 1. Получение контекста (обычно из `NSPersistentContainer`)
let context = persistentContainer.viewContext

// 2. Создание объекта
let dog = Dog(context: context) // `Dog` — подкласс `NSManagedObject`
dog.name = "Rex"
dog.age = 3

// 3. Сохранение
try? context.save()

Когда что выбирать?

  • Realm: Нужна высокая производительность, простота API, кроссплатформенность или работа с большими объемами данных.
  • Core Data: Проект глубоко интегрирован в экосистему Apple, требуются сложные связи между объектами, или есть legacy-код.