0Pricing
Swift Academy · Урок

URLSession data(from:) с async/await

Асинхронно получайте данные из REST API с помощью современного API URLSession.

«URLSession data(from:) с async/await» — бесплатный урок Swift Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 4 уроков всего.

Современный API URLSession

Swift 5.5 и новее предоставляет асинхронные варианты методов URLSession: data(from:delegate:), которые приостанавливают выполнение вместо использования обратных вызовов.

let (data, response) = try await URLSession.shared.data(from: URL(string: "https://api.example.com/items")!)

Полная функция получения данных

Оберните вызов в асинхронную функцию, которая может выдавать ошибки, чтобы её можно было комбинировать и тестировать.

func fetchItems() async throws -> [Item] {
  let url = URL(string: "https://api.example.com/items")!
  let (data, _) = try await URLSession.shared.data(from: url)
  return try JSONDecoder().decode([Item].self, from: data)
}

Вызов из SwiftUI

Вызывайте асинхронные функции из модификатора .task или из Task { } внутри действия кнопки.

struct ItemList: View {
  @State private var items: [Item] = []
  var body: some View {
    List(items, id: \.id) { Text($0.name) }
      .task { items = (try? await fetchItems()) ?? [] }
  }
}

URLRequest для пользовательских заголовков

Создайте URLRequest с методом, заголовками и телом запроса, затем передайте его в data(for:).

var request = URLRequest(url: URL(string: "https://api.example.com/login")!)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.httpBody = try? JSONEncoder().encode(LoginBody(email: "a@b.com", password: "pass"))
let (data, _) = try await URLSession.shared.data(for: request)

Проверка HTTP-статуса

Приведите ответ к типу HTTPURLResponse и проверьте код состояния перед декодированием.

let (data, response) = try await URLSession.shared.data(from: url)
guard let http = response as? HTTPURLResponse, http.statusCode == 200 else {
  throw URLError(.badServerResponse)
}
let item = try JSONDecoder().decode(Item.self, from: data)

Отмена

Отмена родительской задачи Task автоматически отменяет выполняющийся запрос URLSession.

let task = Task {
  let items = try await fetchItems()
  // ...
}
task.cancel() // cancels URLSession request if in-flight

Загрузка данных

Используйте upload(for:from:), чтобы асинхронно отправлять двоичные данные или данные формы методом POST.

var request = URLRequest(url: uploadURL)
request.httpMethod = "POST"
let (data, _) = try await URLSession.shared.upload(for: request, from: imageData)

Скачивание файлов

download(from:) скачивает файл во временный URL на диске, а не в память.

let (fileURL, _) = try await URLSession.shared.download(from: remoteURL)
let destURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0].appendingPathComponent("file.pdf")
try FileManager.default.moveItem(at: fileURL, to: destURL)

Пользовательская конфигурация URLSession

Создайте пользовательский сеанс с тайм-аутами, политикой кэширования и поддержкой фонового выполнения.

let config = URLSessionConfiguration.default
config.timeoutIntervalForRequest = 30
config.requestCachePolicy = .reloadIgnoringLocalCacheData
let session = URLSession(configuration: config)

async bytes для потоковой передачи

Используйте bytes(from:), чтобы передавать данные ответа построчно без буферизации всего ответа.

let (stream, _) = try await URLSession.shared.bytes(from: url)
for try await line in stream.lines {
  print(line)
}

Тестирование с URLProtocol

Подменяйте сетевые ответы в тестах, создавая подкласс URLProtocol и внедряя его в пользовательскую конфигурацию сеанса.

class MockURLProtocol: URLProtocol {
  static var requestHandler: ((URLRequest) throws -> (HTTPURLResponse, Data))?
  // override canInit, startLoading, stopLoading
}

Быстрая проверка

Какой асинхронный метод URLSession скачивает ответ URL непосредственно во временный файл на диске?

Итоги урока

Используйте URLSession.shared.data(from:) для асинхронных запросов GET, data(for:) с пользовательским URLRequest для POST/PUT, download(from:) для скачивания файлов и bytes(from:) для потоковой передачи. Всегда проверяйте код состояния HTTP перед декодированием.

Часто задаваемые вопросы

Урок «URLSession data(from:) с async/await» бесплатный?

Да — полный текст урока «URLSession data(from:) с async/await» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 4 уроков всего.

Чему я научусь в уроке «URLSession data(from:) с async/await»?

Асинхронно получайте данные из REST API с помощью современного API URLSession. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Swift Academy?

Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «URLSession data(from:) с async/await»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Swift Academy?

Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. URLSession data(from:) с async/await
  2. Codable: кодирование и декодирование JSON
  3. Обработка ошибок и коды состояния HTTP
  4. Логика повторных попыток и фоновый URLSession
← Назад к Swift Academy