我有一个 API 类,在其中创建一个 URL 会话数据任务,当任务从 DispatchQueue.main.async 块内完成时,该任务会更新类中 birdResult 属性的值。
我的课程代码如下:
class BirdsAPI: ObservableObject {
static let url = URL(string: "https://api.inaturalist.org/v1/observations?iconic_taxa=Aves&per_page=50&order=desc&order_by=created_at")
@Published var birdResults: [BirdResult] = []
func fetchObservations() {
URLSession.shared.dataTask(with: URLRequest(url: BirdsAPI.url!)) { data, response, error in
guard error == nil else { return }
let decoder = JSONDecoder()
do {
let body = try decoder.decode(Body.self, from: data!)
DispatchQueue.main.async {
self.birdResults = body.results
}
} catch let error {
print("error decoding data, \(error)")
}
}.resume()
}
}
这是为什么?我该如何解决?
@Senable 描述了可以安全并发共享的类型。即:
目的是避免产生数据竞争的风险。在您的示例中,您的
BirdsAPI
类不符合Senable
,但 CompletionHandler 标记为@Sendable
:尽管您可以使用 忽略 Swift 6 中的错误
@unchecked
。除非在修改属性时有某种内部锁定机制,否则不应这样做。因此,我建议将代码重构为以下内容,并避免将该
DispatchQueue
系列与新的并发性相结合async await
。