В чем разница между URLSession и Alamofire для сетевых запросов в iOS?

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

Ответ

URLSession — это нативный фреймворк Apple для выполнения сетевых операций. Alamofire — популярная сторонняя библиотека, которая является удобной обёрткой над URLSession.

Сравнение:

Критерий URLSession Alamofire
Происхождение Нативный фреймворк (Foundation). Сторонняя библиотека (обёртка над URLSession).
Синтаксис Более многословный, императивный. Лаконичный, цепочечный (chaining), декларативный.
Функциональность Базовая: запросы, загрузка, кэширование, аутентификация. Расширенная: встроенная валидация, автоматическая сериализация, индикатор прогресса, повтор запросов, логирование.
Зависимости Не требует добавления внешних библиотек. Добавляет зависимость в проект (через Swift Package Manager, CocoaPods, Carthage).
Сложность Требует больше boilerplate-кода для типовых операций. Упрощает выполнение стандартных задач.

Пример одного и того же GET-запроса:

С использованием URLSession:

guard let url = URL(string: "https://api.example.com/data") else { return }

let task = URLSession.shared.dataTask(with: url) { data, response, error in
    if let error = error {
        print("Ошибка: ", error)
        return
    }
    guard let httpResponse = response as? HTTPURLResponse,
          (200...299).contains(httpResponse.statusCode) else {
        print("Неудачный статус-код")
        return
    }
    if let data = data {
        // Ручная десериализация JSON
        let result = try? JSONDecoder().decode(MyModel.self, from: data)
    }
}
task.resume()

С использованием Alamofire:

import Alamofire

AF.request("https://api.example.com/data")
    .validate(statusCode: 200..<300) // Встроенная валидация
    .responseDecodable(of: MyModel.self) { response in // Автоматическая десериализация
        switch response.result {
        case .success(let model):
            print("Успех: ", model)
        case .failure(let error):
            print("Ошибка: ", error)
        }
    }

Когда что выбирать:

  • Используйте URLSession, если вам важна минимальная зависимость проекта, вы делаете простые запросы или хотите полного низкоуровневого контроля.
  • Используйте Alamofire, если в проекте много сетевых операций, нужны удобные функции (валидация, прогресс, повтор) и вы хотите сократить boilerplate-код.