Ответ
Постоянное хранилище (Persistent Storage) в iOS — это механизм сохранения данных приложения между его запусками и даже после перезагрузки устройства. Данные хранятся во внутренней памяти устройства.
Основные технологии:
| Технология | Назначение | Пример использования |
|---|---|---|
| UserDefaults | Простые ключ-значения (настройки, флаги). | Сохранение выбранной пользователем темы. |
| Файловая система (FileManager) | Произвольные файлы (документы, изображения, кэш). | Сохранение загруженного PDF-документа. |
| Core Data | Объектно-графовая и реляционная модель. Сложные структурированные данные. | Приложение для учета задач или каталог товаров. |
| SQLite | Реляционная база данных (часто через обертку, например, GRDB). | Аналогично Core Data, с прямым SQL-контролем. |
| Keychain | Безопасное хранение чувствительных данных (пароли, токены). | Токены аутентификации (OAuth, JWT). |
Примеры кода:
-
UserDefaults:
// Запись UserDefaults.standard.set("dark", forKey: "appTheme") // Чтение let theme = UserDefaults.standard.string(forKey: "appTheme") -
Сохранение файла в Documents:
let fileURL = FileManager.default .urls(for: .documentDirectory, in: .userDomainMask)[0] .appendingPathComponent("data.json") let data = "{"key": "value"}".data(using: .utf8)! try data.write(to: fileURL)
Важно: Данные в постоянном хранилище удаляются вместе с приложением, кроме данных в Keychain, которые могут сохраняться (при соответствующей настройке kSecAttrAccessGroup).
Ответ 18+ 🔞
А, ну это же классика, блядь! Вечная тема — куда приложению свою хуйню деть, чтобы после перезагрузки не обнулиться, как последний мудак. Слушай, тут всё просто, но есть нюансы, ёпта.
Вот смотри, у тебя есть несколько контор, куда можно свалить данные. Каждая — для своего уровня бардака.
UserDefaults — это типа твоя тумбочка у кровати. Кинул туда ключи, пульт, пачку сигарет. Быстро, удобно, но если начнёшь туда гирю класть — полка ебнется. Только для простых настроек, флажков, какой-нибудь выбранной темы. Не лезь туда с архивами, а то потом будешь плакать.
// Запихнул тему
UserDefaults.standard.set("dark", forKey: "appTheme")
// Достал, проверил, не проёбан ли
let theme = UserDefaults.standard.string(forKey: "appTheme")
Файловая система (FileManager) — это уже свой гараж. Хочешь — коробки с елочными игрушками складывай, хочешь — старый мотоцикл разбирай. Для документов, картинок, кэша, да чего угодно. Главное — не захламить всё в хлам.
// Нашёл угол в гараже (папка Documents)
let fileURL = FileManager.default
.urls(for: .documentDirectory, in: .userDomainMask)[0]
.appendingPathComponent("data.json")
// Запихнул туда свою бумажку
let data = "{"key": "value"}".data(using: .utf8)!
try data.write(to: fileURL)
Core Data — это уже, сука, целый складской комплекс с роботами-погрузчиками, штрих-кодами и кучей правил. Объектно-графовая хуйня, связи, миграции. Мощно, гибко, но если не разобраться — такую кашу заваришь, что потом волосы на жопе рвать будешь. Для сложных структур: задачи, товары, пользователи.
SQLite — тот же склад, но ты сам себе начальник и грузчик. Сам пишешь SQL-запросы, сам всё организуешь. Контроль полный, но и возни, блядь, овердохуища. Часто берут обёртки вроде GRDB, чтобы жизнь мёдом не казалась.
И наконец, король всех парадов — Keychain. Это не просто хранилище, это, блядь, банковская ячейка внутри Форт-Нокса. Сюда только самое ценное: пароли, токены, цифровые отпечатки. Эта штука может пережить даже удаление приложения, если правильно настроить. Всё шифруется, охраняется системой. Пытаться хранить тут что-то кроме секретов — это как в сейф складывать пустые бутылки, пидарас шерстяной.
И запомни главное, чувак: когда пользователь выносит твоё приложение в корзину — система выгребает весь этот гараж, тумбочку и склад. Всё, нахуй. Кроме той самой банковской ячейки (Keychain). Она может остаться, если ты её специально не запечатал. Вот так-то, в рот меня чих-пых.