Использование JSONDecoder в фоновом потоке в Swift 5.5

#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 считает наиболее эффективным. На практике это, вероятно, не будет основной нитью, но теоретически иногда может быть.