我最近看到 Swift 在Swift 5.5 中引入了对 Actor 模型的并发支持。当我们有一个共享的、可变的状态时,这个模型支持安全的并发代码以避免数据竞争。
我想避免应用程序 UI 中的主线程数据竞争。为此,我将DispatchQueue.main.async在调用站点中设置UIImageView.image属性或UIButton样式的任何地方进行包装。
// Original function
func setImage(thumbnailName: String) {
myImageView.image = UIImage(named: thumbnailName)
}
// Call site
DispatchQueue.main.async {
myVC.setImage(thumbnailName: "thumbnail")
}
Run Code Online (Sandbox Code Playgroud)
这似乎不安全,因为我必须记住在主队列上手动调度该方法。另一种解决方案如下所示:
func setImage(thumbnailName: UIImage) {
DispatchQueue.main.async {
myImageView.image = UIImage(named: thumbnailName)
}
}
Run Code Online (Sandbox Code Playgroud)
但这看起来像很多样板文件,我不会说我喜欢将它用于具有不止一层嵌套的复杂功能。
Swift 对 Actors 的支持看起来像是一个完美的解决方案。那么,有没有办法让我的代码更安全,即始终使用 Actors 在主线程上调用 UI 函数?