这是什么意思?我尝试了这个......仍然,它给了我同样的信息:
DispatchQueue.main.async {
if let imageData = try? Data(contentsOf: url) {
self.image = UIImage(data: imageData)
}
}
正如消息所说,这意味着Data(contentsOf:)
call 在获取数据之前不会返回,如果图像很大并且网络很慢,这可能会很慢。当您从主线程调用此函数时,在最坏的情况下,整个应用程序 UI 将冻结几秒钟。
编译器/运行时只是通过返回此错误消息来帮助您避免这种潜在的陷阱,其中包含有关如何解决问题的明确指示:使用URLSession.shared.dataTask(with:completionHandler:)
代替Data(contentsOf:)
.
func setImageFromStringrURL(stringUrl: String) {
if let url = URL(fromString: stringUrl) {
URLSession.shared.dataTask(with: url) { (data, response, error) in
// Error handling...
guard let imageData = data else { return }
DispatchQueue.main.async {
self.image = UIImage(data: imageData)
}
}.resume()
}
}
该方法不会阻塞主线程。相反,它会安排网络调用在后台线程上执行,并在获取数据后执行您提供的回调(负责更新 UI)。
由于回调也在后台线程上执行,并且 UI 更新必须在主线程上进行,因此您仍然需要显式安排要在主线程上执行的 UI 更新:DispatchQueue.main.async
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)