Что такое постоянное хранилище (Persistent Storage) в iOS?

Ответ

Постоянное хранилище (Persistent Storage) в iOS — это механизм сохранения данных приложения между его запусками и даже после перезагрузки устройства. Данные хранятся во внутренней памяти устройства.

Основные технологии:

Технология Назначение Пример использования
UserDefaults Простые ключ-значения (настройки, флаги). Сохранение выбранной пользователем темы.
Файловая система (FileManager) Произвольные файлы (документы, изображения, кэш). Сохранение загруженного PDF-документа.
Core Data Объектно-графовая и реляционная модель. Сложные структурированные данные. Приложение для учета задач или каталог товаров.
SQLite Реляционная база данных (часто через обертку, например, GRDB). Аналогично Core Data, с прямым SQL-контролем.
Keychain Безопасное хранение чувствительных данных (пароли, токены). Токены аутентификации (OAuth, JWT).

Примеры кода:

  1. UserDefaults:

    // Запись
    UserDefaults.standard.set("dark", forKey: "appTheme")
    // Чтение
    let theme = UserDefaults.standard.string(forKey: "appTheme")
  2. Сохранение файла в 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). Она может остаться, если ты её специально не запечатал. Вот так-то, в рот меня чих-пых.