1. Realm
let realm = try! Realm()
try! realm.write {
realm.add(Person(value: ["name": "John", "age": 30]))
}
Преимущества:
- Простота API: Более интуитивный интерфейс по сравнению с Core Data
- Лучшая многопоточность: Автоматическое обновление объектов между потоками
- Высокая производительность: До 10x быстрее Core Data на некоторых операциях
- Live objects: Автоматическое обновление UI при изменении данных
- Кроссплатформенность: Работает на iOS, Android и других платформах
Недостатки:
- Размер приложения: Увеличивает билд на ```5-10MB
- Ограниченная миграция: Сложнее делать сложные изменения модели
- Нет интеграции с CloudKit: Требует Realm Sync для облачной синхронизации
2. SQLite
// Пример с GRDB
try dbQueue.write { db in
try Player(name: "Alice", score: 1000).insert(db)
}
Популярные библиотеки:
Преимущества:
- Полный контроль: Можно писать сложные SQL-запросы
- Максимальная производительность: Лучшая для сложных запросов к большим данным
- Маленький размер: Незначительно увеличивает билд
- Зрелость: Проверенная временем технология
Недостатки:
- Кривая обучения: Требуется знание SQL
- Ручная работа с объектами: Нет ORM "из коробки"
- Многопоточность: Требует ручного управления
3. Firebase Realtime Database
ref.child("users").child(userId).setValue(["username": name])
Преимущества:
- Облачное решение: Не требует серверной разработки
- Real-time обновления: Автоматическая синхронизация между устройствами
- Оффлайн-режим: Работает без интернета с последующей синхронизацией
Недостатки:
- Зависимость от сети: Не чисто локальное решение
- Цена: Может стать дорогим при больших объемах данных
- Ограниченные запросы: Нет сложных SQL-подобных запросов
4. SwiftData
@Model
class User {
var name: String
var age: Int
}
let container = try ModelContainer(for: User.self)
Преимущества:
- Современный Swift-ориентированный API: Проще чем Core Data
- Интеграция с SwiftUI: Первоклассная поддержка
- Под капотом Core Data: Использует проверенную технологию
Недостатки:
- Только iOS 17+: Не подходит для поддержки старых версий
- Менее гибкий: Пока уступает Core Data в возможностях
- Молодая технология: Может иметь "детские болезни"
5. FileSystem + Codable
struct Config: Codable {
var theme: String
var notifications: Bool
}
let data = try JSONEncoder().encode(config)
try data.write(to: fileURL)
Преимущества:
- Полная простота: Минимальный boilerplate код
- Контроль над форматом: Можно использовать JSON, Plist, etc.
- Хорошо для конфигов: Идеально для небольших структур
Недостатки:
- Нет запросов: Приходится загружать все данные
- Нет инкрементальных обновлений: Перезапись всего файла
- Проблемы с большими данными: Не масштабируется
Сравнительная таблица
Критерий | Core Data | Realm | SQLite | Firebase | SwiftData |
Производительность | Высокая | Очень высокая | Максимальная | Средняя | Высокая |
Кривая обучения | Крутая | Средняя | Средняя | Низкая | Низкая |
Многопоточность | Сложная | Простая | Средняя | Простая | Простая |
Offline-работа | Да | Да | Да | Да (с оговорками) | Да |
Облачная синхронизация | Через CloudKit | Realm Sync | Нет | Встроенная | Через CloudKit |
Размер билда | Маленький | +5-10MB | Маленький | Средний | Маленький |
Резюмируем
-
Realm выбирайте если:
- Нужна кроссплатформенность
- Важна простота API и производительность
- Готовы мириться с увеличением размера приложения
-
SQLite подходит когда:
- Требуется абсолютный контроль над запросами
- Работаете с большими объемами данных
- Готовы писать больше boilerplate кода
-
Firebase идеален для:
- Быстрого старта без бэкенда
- Real-time синхронизации между устройствами
- Проектов где оффлайн-режим вторичен
-
SwiftData рассматривайте для:
- Новых проектов с таргетом на iOS 17+
- Максимальной интеграции с SwiftUI
- Когда хотите modern Swift API без сложностей Core Data
-
FileSystem + Codable используйте для:
- Простых конфигурационных данных
- Когда не нужны сложные запросы
- Максимально простых случаев хранения
Выбор зависит от требований проекта: Core Data остается самым мощным решением для сложных iOS-приложений, но альтернативы часто предлагают более простые решения для конкретных задач.