完成处理程序中捕获的值不发生变化
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
,但会在发生变异之前返回其空值。
所以我这里有一个 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
,但会在发生变异之前返回其空值。