Почему не всегда можно использовать UserDefaults вместо Core Data или Realm
Что проверяют
Понимаете ли вы, что UserDefaults это хранилище настроек, а не база данных, и умеете ли выбирать хранилище по требованиям к данным, а не по привычке.
Как отвечать
UserDefaults это словарь ключ-значение поверх plist-файла, который целиком поднимается в память и периодически сбрасывается на диск. Отсюда и ограничения:
- объём: набор читается и пишется целиком, крупные данные раздувают память и замедляют старт;
- структура: нет схемы, нет отношений, нет версионирования. Массив объектов приходится сериализовать руками, а при смене модели разбирать старый формат в коде;
- выборки: нельзя отфильтровать, отсортировать или взять страницу, нужно поднять всё и перебирать в памяти;
- частичность: поменялся один элемент списка, переписывается весь ключ;
- согласованность: нет транзакций, два места в приложении спокойно затирают запись друг друга;
- безопасность: значения лежат открыто и уезжают в бэкап, для токенов и паролей есть Keychain;
- наблюдение: Core Data даёт
NSFetchedResultsController, Realm даёт нотификации на результат запроса, здесь остаётся KVO по ключу.
Core Data и Realm поверх настоящего хранилища дают ленивую загрузку, индексы, предикаты, транзакции и миграции схемы.
Практичная граница: UserDefaults для флагов, выбранной темы, последнего открытого экрана, признака пройденного онбординга. Списки, кэш ленты, офлайн-данные и история в базу, крупные файлы в файловую систему, а в базе только путь к ним.
Где спотыкаются
Повторяют, что UserDefaults пишет на диск при каждом изменении и потому медленный. Запись буферизуется, synchronize() давно не требуется. Проблема не в частоте записи, а в том, что весь набор живёт в памяти и сохраняется целиком.
Кладут туда токен доступа или персональные данные. Файл доступен в бэкапе и в контейнере приложения, это находка для любого аудита безопасности.
Сравнивают Core Data и Realm только по скорости и забывают про миграции и про потоки. Объект Realm привязан к своему потоку, NSManagedObject к своему контексту, и именно это чаще всего оказывается настоящей ценой выбора.