В чем разница между Realm и Core Data в 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-код.

Ответ 18+ 🔞

Слушай, давай разберём эту дилемму, как два нормальных инженера за пивом. Тут у нас два зверя: Realm и Core Data. Один — как шустрый, наглый кот, который везде пролезет, второй — как старый, мудрый, но местами задумчивый бульдог из Cupertino.

По-простому:

  • Realm — это готовая, быстрая, объектная база данных. Принёс, настроил за пять минут, работает. Кроссплатформенный, то есть и на андроиде то же самое.
  • Core Data — это не совсем база данных в лоб. Это, блядь, целый фреймворк для управления графом объектов, который умеет сохраняться. Мощнее в плане связей, но и возни с ним — овердохуища.

Где что выстрелит?

Критерий Realm Core Data
Скорость Часто быстрее, особенно на чтении/записи кучи данных. Может тормозить, если не настроить как следует. Зависит от хранилища (SQLite, память и т.д.).
Простота API — просто песня. Минимум лишних телодвижений. API... Ну, ёпта, нужно танцевать с бубном вокруг контекстов, моделей. Boilerplate-кода — как говна за баней.
Потоки Красота! Объекты сами синхронизируются между потоками. А вот тут пиздец. Самому нужно головой работать: perform, mergeChanges, иначе выстрелишь себе в ногу так, что мало не покажется.
Платформы Вездесущий ублюдок: iOS, Android, macOS. Яблочный аристократ. Только экосистема Apple.
Схема данных Гибкая. Миграции часто — раз плюнуть. Строгая, ёб твою мать. Версионирование модели, миграции — отдельная боль.

Смотри, как код выглядит:

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. Достаём магический контекст (обычно из этого ёбанного контейнера)
let context = persistentContainer.viewContext

// 2. Создаём объект, заклинание "context" обязательно!
let dog = Dog(context: context) // Это не просто собака, это `NSManagedObject`, чёрт возьми!
dog.name = "Rex"
dog.age = 3

// 3. Сохраняем и молимся, чтобы не упало
try? context.save() // Волнение ебать, каждый раз.

Итог, когда что брать:

  • Тащишь Realm, если: нужна скорость на вчера, пишешь на двух платформах, или тебе надоела эта вся яблочная магия с контекстами. Хочешь просто работать, а не ебаться с инфраструктурой.
  • Остаёшься с Core Data, если: проект старый и в нём уже всё завязано на этом добре, нужны очень сложные связи между объектами (графы там всякие), или ты, блядь, истинный фанат Apple и готов страдать во имя идеи.

Вот и вся философия. Выбор, как всегда, между «быстро и просто» и «мощно, но головной болью на постоянной основе». Держи в уме.