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 — локальная установка не требуется.
Все уроки этого курса
- URLSession data(from:) с async/await
- Codable: кодирование и декодирование JSON
- Обработка ошибок и коды состояния HTTP
- Логика повторных попыток и фоновый URLSession