Данные и сеть
В основании почти любого приложения лежат две обязанности: общение с сервером и хранение данных на устройстве. Они кажутся разными, но на собеседовании их проверяют вместе, потому что у них одна дисциплина — знать, что в каком потоке выполняется и что где можно хранить. Сеть по своей природе асинхронна и не должна блокировать главный поток; URLSession даёт data-, upload- и download-задачи, Codable превращает JSON в ваши типы, а URLCache бесплатно ревалидирует ответы. Ошибётесь в модели — интерфейс замрёт на медленной сети.
Персистентность — это задача выбора. iOS даёт лестницу хранилищ: UserDefaults для мелких настроек, Keychain для секретов, файловую систему для блобов и Core Data или SwiftData для запрашиваемого графа объектов, — и ловушка собеседования в том, чтобы положить данные не на ту ступень: секрет в UserDefaults, перекачиваемое видео в Documents/ или NSManagedObject, переданный между контекстами. Разберём оба слоя и правила, которые держат их в порядке.
Карта темы
- Сеть — задачи и конфигурации
URLSession,async/awaitпротив делегатного API, декодирование JSON черезCodable, HTTP-кэширование черезURLCache, фоновые передачи, повтор с backoff, аутентификационные вызовы, ATS и пиннинг сертификата, работа офлайн. - Хранение данных — лестница хранилищ и что кладут на каждую ступень:
UserDefaults, Keychain, файловая система, Core Data с его правилом многопоточности контекстов и SwiftData; плюс миграции и ловушка с секретами.
Частые ошибки и ловушки
| Ошибка | Последствие |
|---|---|
| Выполнять запрос на главном потоке | Интерфейс замирает на всё время сетевого вызова |
Хранить токен или пароль в UserDefaults | Секрет открытым текстом в plist, читаемый из бэкапа |
Класть перекачиваемые файлы в Documents/ | Раздувание бэкапа в iCloud и возможный отказ App Review |
Передавать NSManagedObject между контекстами/потоками | Повреждение данных или падение — передавайте objectID и перефетчите |
| Пиннинг сертификата без плана ротации | Приложение не сможет подключиться после ротации запиненного сертификата |
| Повторять каждую ошибку с фиксированной задержкой | «Стадный» всплеск повторов снова роняет восстанавливающийся сервер |
Значение для собеседований
Вопросы про данные и сеть проверяют, знаете ли вы, где выполняется работа и где лежат байты. Кандидат, который говорит «запрос выполняется вне главного потока, декодирую через Codable, а секреты — в Keychain, а не в UserDefaults», сразу опережает того, кто тянет всё в UserDefaults и блокирует главный поток синхронным запросом.
Что обычно проверяют:
- Какая задача и конфигурация
URLSessionподходят для data, upload, download и фоновых передач. - Как работают HTTP-кэширование и декодирование через
Codableи почему запрос не идёт на главном потоке. - В каком хранилище должен лежать каждый вид данных и что нельзя класть в
UserDefaults. - Правило многопоточности контекстов Core Data и как переносить объект между контекстами.
Типичный неверный ответ: «просто сохраняй всё в UserDefaults и запрашивай синхронно, чтобы данные были готовы». На деле синхронные запросы замораживают интерфейс, UserDefaults — это незашифрованный plist, неподходящий для секретов и больших данных, а правильный ответ — асинхронная сеть плюс правильное хранилище под каждый вид данных.