完成处理程序中捕获的值不发生变化

Captured value within completion handler not mutating

所以我这里有一个 async 方法定义在 actor 类型上。我遇到的问题是 people 根本没有被突变;主要是由于我所了解的并发问题。据我所知,完成处理程序是在同一个线程上同时执行的,因此不能改变 people.

尽管如此,我在这方面的知识还很模糊,所以如果有任何解决它的建议,或者更好地解释为什么会发生这种情况,那就太好了!我想到了一些事情,但我对并发还是陌生的。

func getAllPeople() async -> [PersonModelProtocol] { 
        
        let decoder = JSONDecoder()
        var people: [Person] = []
        
        let dataTask = session.dataTask(with: request!) { data, response, error in
            do {
                let newPeople = try! decoder.decode([Person].self, from: data!)
                people = newPeople
            } catch {
                print(error)
            }
        }
        dataTask.resume()
        return people
    }

如果您确实想要使用async/await,您必须使用适当的API。

func getAllPeople() async throws -> [Person] { 
    let (data, _ ) = try await session.data(for: request!)
    return try JSONDecoder().decode([Person].self, from: data)
}

在同步上下文中,您无论如何都不能 return 来自完成处理程序的数据。

vadian 是对的,但现在 better-expressed 作为计算的 属性。

var allPeople: [PersonModelProtocol] {
  get async throws {
    try JSONDecoder().decode(
      [Person].self,
      from: await session.data(for: request!).0
    )
  }
}

此外,您的代码确实会发生变异 people,但会在发生变异之前返回其空值。