Приведи пример использования класса `URLSession` из стандартной библиотеки Swift.

Ответ

URLSession — это основной класс для выполнения сетевых HTTP/HTTPS-запросов в iOS/macOS.

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

// 1. Определяем URL
let url = URL(string: "https://api.github.com/users/apple")!

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

    // Проверяем на ошибку сети
    if let error = error {
        print("Network error: (error.localizedDescription)")
        return
    }

    // Проверяем HTTP статус-код
    guard let httpResponse = response as? HTTPURLResponse,
          (200...299).contains(httpResponse.statusCode) else {
        print("Server returned an error")
        return
    }

    // Парсим полученные данные (JSON)
    guard let data = data else { return }

    do {
        let json = try JSONSerialization.jsonObject(with: data, options: [])
        print("Successfully received JSON: (json)")
    } catch {
        print("JSON parsing error: (error)")
    }
}
task.resume() // 4. Не забываем запустить задачу

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

  • URLSession.shared — синглтон для простых запросов. Для кастомных настроек (таймауты, кеширование) создают экземпляр URLSession(configuration:).
  • Асинхронность: Запрос не блокирует главный поток.
  • Типы задач: Помимо dataTask, существуют downloadTask (для файлов) и uploadTask.

Ответ 18+ 🔞

А, ну вот, смотри, классика жанра, блядь! URLSession — это типа твой главный по тачкам, который будет кататься по интернетам и таскать данные, как последний курьер. В iOS и macOS без него нихуя, если ты, конечно, не хочешь вручную сокеты ебашить, на что у тебя терпения ноль ебать.

Вот тебе простейший пример, как спиздить инфу с какого-нибудь сервака (GET-запрос):

// 1. Тыкаешь пальцем в адрес, куда слать запрос
let url = URL(string: "https://api.github.com/users/apple")! // Во, посмотрим, что там у Эппл в профиле

// 2. Берёшь общую сессию (shared) и говоришь: "Слушай, дружище, сгоняй-ка туда"
let task = URLSession.shared.dataTask(with: url) { data, response, error in
    // 3. А это колбэк, который вызовется, когда твой гонец вернётся (и будет он в каком-то левом потоке, имей в виду!)

    // Первым делом — не наебал ли он тебя? Может, связи нет?
    if let error = error {
        print("Сеть, сука, глючит: (error.localizedDescription)")
        return
    }

    // Теперь смотрим, что сервер тебе ответил. Не послал ли он тебя нахуй с кодом 404?
    guard let httpResponse = response as? HTTPURLResponse,
          (200...299).contains(httpResponse.statusCode) else {
        print("Сервер выдал какую-то дичь вместо нормального ответа")
        return
    }

    // Окей, вроде не послал. Данные-то принёс?
    guard let data = data else { return } // А если нет, то и делать нихуя

    // Пытаемся разобрать эту абракадабру, обычно JSON
    do {
        let json = try JSONSerialization.jsonObject(with: data, options: [])
        print("Ура, блядь, JSON в кармане: (json)")
    } catch {
        print("А JSON-то кривой, распарсить не могу: (error)")
    }
}
task.resume() // 4. САМОЕ ГЛАВНОЕ, ёпта! Не забудь дать пинка под зад, чтобы задача ПОЕХАЛА. А то так и будет висеть.

На что тут смотреть, чтобы не облажаться:

  • URLSession.shared — это как такси общее. Удобно, дёшево, но если тебе нужны особые понты (свои таймауты, кеширование или куки), то заказывай личную машину через URLSession(configuration:).
  • Всё это дело — асинхронное. Пока запрос ползёт, твой интерфейс не зависнет, пользователь может дальше тыкать в кнопки. Красота.
  • Задачи бывают разные. dataTask — для обычных данных. Хочешь скачать файл на диск — downloadTask. Хочешь что-то отправить — uploadTask. Выбирай, что надо, блядь.