【发布时间】:2020-07-01 00:38:34
【问题描述】:
在 Swift 中异步改变字典/其他集合的惯用正确方法是什么?
编码时经常会出现以下几种情况:
func loadData(key: String, dict: inout [String: String]) {
// Load some data. Use DispatchQueue to simulate async request
DispatchQueue.main.async {
dict[key] = "loadedData"
}
}
var dict = [String:String]()
for x in ["a", "b", "c"] {
loadData(key: x, dict: &dict)
}
在这里,我异步加载一些数据并将其添加到作为参数传入的集合中。
但是,由于inout 的复制语义,此代码无法在 Swift 中编译。
我已经想到了两个解决这个问题的方法:
- 将字典包装在一个类中,然后将这个类传递给函数。然后我可以改变这个类,因为它不是一个值类型。
- 使用不安全的指针
执行此操作的惯用正确方法是什么?
我看到这个问题中有一些关于这个话题的讨论:Inout parameter in async callback does not work as expected。但是,没有一个答案集中在如何实际解决问题上,只是为什么现在的代码不起作用。
【问题讨论】:
标签: ios swift asynchronous