#swift #concurrency
Вопрос:
Следующий сеанс URL-адреса выполняется асинхронно. Но как насчет этапа декодирования JSON? Это происходит в основном потоке?
func fetchFavorites() async throws -> [Int] {
let url = URL(string: "https://hws.dev/user-favorites.json")!
let (data, _) = try await URLSession.shared.data(from: url)
return try JSONDecoder().decode([Int].self, from: data)
}
Ответ №1:
decode
Задача, как сказал Джошуа, будет выполняться в потоке по усмотрению новой системы параллелизма (включая основной поток). Когда вы инициируете новую задачу, она может начаться в текущем потоке или в другом потоке(потоках), взятых из пула совместных потоков. Кроме того, Swift может запустить код продолжения (код после await
) в еще одном потоке из пула совместных потоков (см. Видео WWDC 2021 Параллелизм Swift: за кулисами).
Комментарии:
1. Когда вы запускаете задачу с
Task { ... }
помощью этого, вы не гарантируете, что она не будет выполняться в основном потоке. Иногда это происходит в основном потоке. Похоже , что если вы используетеTask.detached { ... }
, это заставит его использовать фоновый поток.
Ответ №2:
Вы вызываете decode(...)
из своей асинхронной fetchFavorites()
функции. Это означает, что весь код в нем выполняется в любом потоке(потоках), который среда выполнения Swift считает наиболее эффективным. На практике это, вероятно, не будет основной нитью, но теоретически иногда может быть.