Что такое URLSession в iOS и как выполнить простой сетевой запрос?

«Что такое URLSession в iOS и как выполнить простой сетевой запрос?» — вопрос из категории Сети, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

URLSession — это основной фреймворк в iOS для выполнения сетевых операций по HTTP/HTTPS. Он поддерживает загрузку данных, файлов, фоновые задачи, аутентификацию и кэширование.

Ключевые компоненты:

  1. URLSession: Объект сессии, координирующий группу связанных сетевых задач.
  2. URLSessionConfiguration: Определяет поведение сессии (кэширование, таймауты, использование сотовой сети). Основные типы:
    • .default: Сессия с дисковым кэшем и куками.
    • .ephemeral: Сессия без сохранения данных на диск.
    • .background: Для выполнения задач, когда приложение не активно.
  3. URLSessionTask: Абстрактный класс, представляющий задачу. Конкретные типы:
    • URLSessionDataTask: Для получения данных в память.
    • URLSessionDownloadTask: Для загрузки файлов на диск.
    • URLSessionUploadTask: Для отправки данных (например, файлов).

Пример GET-запроса с использованием общей (shared) сессии:

// 1. Создание URL
let url = URL(string: "https://api.example.com/data")!

// 2. Создание задачи DataTask
let task = URLSession.shared.dataTask(with: url) { data, response, error in
    // 3. Обработка ответа (выполняется в фоновом потоке)
    if let error = error {
        print("Network error: (error)")
        return
    }

    guard let httpResponse = response as? HTTPURLResponse,
          (200...299).contains(httpResponse.statusCode) else {
        print("Server error")
        return
    }

    guard let data = data else { return }

    // 4. Декодирование данных (например, в JSON)
    do {
        let decodedData = try JSONDecoder().decode(MyModel.self, from: data)
        DispatchQueue.main.async {
            // Обновление UI на главном потоке
            self.updateUI(with: decodedData)
        }
    } catch {
        print("Decoding error: (error)")
    }
}

// 5. Запуск задачи
task.resume()

Важно: Для сложных сценариев (обработка редиректов, аутентификация, отслеживание прогресса) используется создание кастомной сессии с делегатом (URLSessionDelegate).