← Назад к вопросам

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

2.3 Middle🔥 101 комментариев
#Работа с сетью

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое URLSession

URLSession — это фундаментальный компонент фреймворка Foundation в iOS/macOS, предоставляющий API для выполнения сетевых запросов и управления сессиями взаимодействия с серверами через протоколы HTTP/HTTPS, FTP, а также для загрузки файлов по URL. Он представляет собой высокоуровневый, асинхронный и безопасный (поддерживающий TLS) механизм, заменяющий старый NSURLConnection. URLSession работает на основе концепции сессий (URLSession), задач (URLSessionTask) и конфигураций (URLSessionConfiguration).

Ключевые составляющие:

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

Как выполнять сетевые запросы

1. Создание конфигурации и сессии

Стандартный подход — использование shared session для простых запросов или создание собственной сессии для сложных сценариев.

// Использование общей сессии (нет делегатов, ограниченные возможности)
let sharedSession = URLSession.shared

// Создание сессии с кастомной конфигурацией
let configuration = URLSessionConfiguration.default
configuration.timeoutIntervalForRequest = 30
configuration.httpAdditionalHeaders = ["User-Agent": "MyApp"]
let customSession = URLSession(configuration: configuration)

2. Формирование URLRequest

Для управления деталями запроса (метод, заголовки, тело) используется URLRequest.

guard let url = URL(string: "https://api.example.com/data") else { return }
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
let body = try? JSONSerialization.data(withJSONObject: ["key": "value"])
request.httpBody = body

3. Создание и запуск задачи

Чаще всего используется URLSessionDataTask для взаимодействия с REST API.

Пример с completion handler (простой способ):

let task = URLSession.shared.dataTask(with: request) { data, response, error in
    if let error = error {
        print("Ошибка сети: \(error.localizedDescription)")
        return
    }
    
    guard let httpResponse = response as? HTTPURLResponse,
          (200...299).contains(httpResponse.statusCode) else {
        print("Неуспешный статус код")
        return
    }
    
    if let data = data {
        do {
            let json = try JSONSerialization.jsonObject(with: data)
            print("Полученные данные: \(json)")
        } catch {
            print("Ошибка парсинга JSON")
        }
    }
}
task.resume() // Запуск задачи

Пример с использованием делегата (для отслеживания прогресса):

class NetworkManager: NSObject, URLSessionDataDelegate {
    var session: URLSession!
    
    init() {
        let config = URLSessionConfiguration.default
        super.init()
        session = URLSession(configuration: config, delegate: self, delegateQueue: nil)
    }
    
    func startDownload(url: URL) {
        let task = session.dataTask(with: url)
        task.resume()
    }
    
    // Делегатный метод для получения данных
    func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) {
        print("Получено части данных: \(data.count) байт")
    }
}

4. Обработка ответа и ошибок

Важно проверять:

  • Ошибку сети (error).
  • Статус код HTTP (HTTPURLResponse.statusCode).
  • Данные (data) – преобразовывать в нужный формат (JSON через JSONDecoder, изображение через UIImage(data:)).

5. Best Practices и важные замечания

  • Асинхронность: все задачи выполняются асинхронно, не блокируют UI.
  • Управление памятью: сессии могут быть сильными ссылками, важно инвалидировать (finishTasksAndInvalidate()), если они не нужны.
  • Бэкграунд сессии: для загрузок в фоне используются URLSessionDownloadTask с URLSessionConfiguration.background.
  • Кэширование: контролируется через URLSessionConfiguration (например, URLCache).
  • Обработка SSL/TLS: URLSession автоматически поддерживает безопасные соединения, но можно настроить через делегатные методы для проверки сертификатов.

URLSession — мощный инструмент, который, при правильном использовании, обеспечивает надежную, безопасную и эффективную сетевую коммуникацию в iOS приложениях. Для современных приложений часто используются дополнительные библиотеки (Alamofire), но понимание нативного API остается критически важным для глубокого контроля над сетевыми операциями.

Что такое URLSession и как выполнять сетевые запросы? | PrepBro