【问题标题】:Using JSONDecoder on a background thread in Swift 5.5+在 Swift 5.5+ 的后台线程上使用 JSONDecoder
【发布时间】:2021-11-06 08:58:50
【问题描述】:

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

【问题讨论】:

    标签: swift concurrency


    【解决方案1】:

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

    【讨论】:

    • 当您使用Task { ... } 启动任务时,您不能保证它不会在主线程上运行。它有时会发生在主线程上。看起来如果你使用Task.detached { ... },这将迫使它使用后台线程。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2017-02-15
      • 2014-07-26
      • 2016-03-30
      • 2019-09-12
      • 2017-11-19
      • 2016-01-30
      • 2018-12-19
      • 1970-01-01
      • 2017-11-26
      相关资源
      最近更新 更多