> Какие системы хранения данных использовали (iOS, Swift)

Уровень: senior · Роль: mobile · Категория: Технические вопросы

Компании: Яндекс

Стек: iOS, Swift

> Пример ответа

Короткий ответ

В iOS-разработке я использовал несколько уровней хранения: UserDefaults для лёгких настроек, Keychain для чувствительных данных, Core Data и SQLite для структурированных данных, а также файловую систему для медиа и кэша. В последних проектах активно применял SwiftData как современную обёртку над Core Data. Выбор зависел от объёма данных, требований к производительности и сложности запросов.

Подробное объяснение

Каждая система хранения решает свою задачу:

  • UserDefaults - синхронное хранилище для небольших объёмов (настройки, флаги, токены, если не критично). Не подходит для больших данных или частого чтения/записи.
  • Keychain - для паролей, ключей, refresh-токенов. Данные шифруются на уровне ОС, доступ ограничен. Работает медленнее, чем UserDefaults, но безопаснее.
  • Core Data - полноценный ORM поверх SQLite. Даёт модель данных, relationships, faulting, undo manager, iCloud sync. Требует аккуратной работы с контекстами и потоками.
  • SQLite - низкоуровневый доступ, полный контроль над SQL. Используется, когда нужна сложная выборка, агрегация или миграции, а Core Data избыточен.
  • SwiftData - новый фреймворк, построенный на макросах и Swift Concurrency. Упрощает модель, но всё ещё опирается на Core Data под капотом.
  • Файловая система (FileManager, Documents, Caches, tmp) - для изображений, видео, больших бинарных данных. Важно учитывать политики очистки кэша.

На практике часто комбинирую: Keychain для токенов, UserDefaults для настроек, Core Data/SwiftData для основной модели, файлы для медиа.

На практике

В реальном проекте я выбирал так:

  • Если данные - это просто настройки с дефолтными значениями - UserDefaults.
  • Если нужен поиск, фильтрация, связи между сущностями - Core Data или SQLite.
  • Если данные чувствительные - Keychain (токены, пароли).
  • Если это кэш изображений - файловая система + NSCache в памяти.

Также учитывал миграции: для Core Data - лёгкие миграции через NSMigrationManager, для SQLite - ручные скрипты. Для SwiftData миграции пока менее зрелые, поэтому в production-проектах с большой моделью я бы предпочёл Core Data.

Пример кода

Пример работы с Core Data:

SWIFT
final class StorageManager {
private let container: NSPersistentContainer
init() {
container = NSPersistentContainer(name: "Model")
container.loadPersistentStores { _, error in
if let error = error {
fatalError("Failed to load store: \(error)")
}
}
}
func saveUser(name: String, age: Int) {
let context = container.viewContext
let user = User(context: context)
user.name = name
user.age = Int16(age)
do {
try context.save()
} catch {
print("Save failed: \(error)")
}
}
func fetchUsers() -> [User] {
let request = User.fetchRequest()
request.sortDescriptors = [NSSortDescriptor(key: "name", ascending: true)]
do {
return try container.viewContext.fetch(request)
} catch {
print("Fetch failed: \(error)")
return []
}
}
}

Как отвечать на собеседовании

Начни с краткого перечисления систем, которые реально использовал. Затем объясни критерии выбора: объём данных, частота доступа, безопасность, сложность модели. Упомяни trade-off между Core Data и SQLite: Core Data даёт абстракцию и меньше кода, но SQLite - больше контроля и предсказуемую производительность. Если упомянул SwiftData - честно скажи, что это эволюция Core Data, и что в production он ещё не так распространён.

Покажи понимание ограничений: UserDefaults не для больших данных, Keychain медленный, файловая система требует управления жизненным циклом. Если спросят про многопоточность - расскажи про NSManagedObjectContext с типом .privateQueueConcurrencyType и про performBackgroundTask.

Что проверяет интервьюер

Интервьюер хочет понять:

  • понимаешь ли ты разницу между системами и их назначение;
  • умеешь ли выбирать инструмент под задачу, а не использовать один для всего;
  • знаешь ли ограничения и подводные камни (например, блокировки UI при синхронной работе с Core Data);
  • имеешь ли опыт с миграциями и производительностью;
  • знаком ли с современными подходами (SwiftData, async/await).

Также проверяется способность объяснить решение простыми словами и защитить его при каверзных вопросах.

Типичные ошибки

  • Использовать UserDefaults для хранения больших массивов или бинарных данных - это приводит к падению производительности и проблемам с памятью.
  • Хранить пароли в UserDefaults - грубая ошибка безопасности.
  • Работать с Core Data из главного потока при больших объёмах данных - блокирует UI.
  • Не учитывать миграции при изменении модели - приложение падает на старой базе.
  • Путать Documents и Caches: в Caches данные могут быть удалены системой, в Documents - нет.
  • Забывать про NSPersistentContainer и создавать контексты вручную без управления жизненным циклом.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью