在 Swift 5.5+ 中的后台线程上使用 JSONDecoder

Using JSONDecoder on a background thread in Swift 5.5+

以下 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)
}

您正在从异步 fetchFavorites() 函数中调用 decode(...)。这意味着其中的所有代码都是 运行 在 Swift 运行时决定最有效的任何线程上。在实践中,它可能不会成为主线程,但理论上它有时可能是。

decode 任务将,正如 Joshua 所说,运行 在新并发系统(包括主线程)的自由裁量权的线程上。当您启动一个新任务时,它可能从当前线程开始,也可能从协作线程池中的另一个线程开始。此外,Swift 可能 运行 协作线程池中的另一个线程上的延续代码(await 之后的代码)(参见 WWDC 2021 视频 Swift concurrency: Behind the scenes)。