> Какие системы хранения данных использовали (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:
SWIFTfinal class StorageManager {private let container: NSPersistentContainerinit() {container = NSPersistentContainer(name: "Model")container.loadPersistentStores { _, error inif let error = error {fatalError("Failed to load store: \(error)")}}}func saveUser(name: String, age: Int) {let context = container.viewContextlet user = User(context: context)user.name = nameuser.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и создавать контексты вручную без управления жизненным циклом.
> Похожие задачи по mobile
Почему после синхронной операции выполнение кода может продолжаться в другом потоке
Есть ли опыт работы с Flutter Web
Что такое SOLID
Какие части HTTP-запроса (хедеры, тело) шифруются в HTTPS
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью