Luk*_*ers -1 crash xcode ios swift
这个代码和它在“尝试!”时崩溃,但我不知道如何捕捉错误并且它是明确的,否则它将无法工作。
func downloadPicture2(finished: () -> Void) {
let imageUrlString = self.payments[indexPath.row].picture
let imageUrl = URL(string: imageUrlString!)!
let imageData = try! Data(contentsOf: imageUrl)
cell.profilePicture.image = UIImage(data: imageData)
cell.profilePicture.layer.cornerRadius = cell.profilePicture.frame.size.width / 2
cell.profilePicture.clipsToBounds = true
}
Run Code Online (Sandbox Code Playgroud)
简短的回答是不要使用try!- 使用do/try/catch并从catch子句中的问题中恢复。
例如 -
func downloadPicture2(finished: () -> Void) {
cell.profilePicture.image = nil
if let imageUrlString = self.payments[indexPath.row].picture,
let imageUrl = URL(string: imageUrlString) {
do {
let imageData = try Data(contentsOf: imageUrl)
cell.profilePicture.image = UIImage(data: imageData)
}
catch {
print("Error fetching image - \(error)")
}
}
cell.profilePicture.layer.cornerRadius = cell.profilePicture.frame.size.width / 2
cell.profilePicture.clipsToBounds = true
}
Run Code Online (Sandbox Code Playgroud)
现在您的代码在 url 无效或没有网络时不会崩溃,但此代码仍然存在一些严重问题。
Data(contentsOf:)在获取数据时阻塞当前线程。由于您在主线程上执行,这将冻结用户界面并提供糟糕的用户体验。
重要的
不要使用这个同步初始化器来请求基于网络的 URL。对于基于网络的URL,这种方法在慢速网络上会阻塞当前线程数十秒,导致用户体验不佳,而在iOS中,可能会导致您的应用程序被终止。
相反,您应该使用异步网络操作,例如dataTask。
此代码对cell- 外部属性进行操作。一旦转向异步代码,您可能会同时获取多个单元格的图像。您应该传递与cell此功能相关的信息以避免冲突。
网络的使用也不是特别有效;假设这是表格或集合视图的一部分,单元格在视图滚动时被重用。发生这种情况时,您将重复获取相同的图像。某种本地缓存会更有效。
如果可以在您的项目中使用外部框架(即您的雇主没有明确禁止它),那么我强烈建议您查看像SDWebImage或KingFisher这样的框架。他们将使这项任务变得更容易和更有效率。
| 归档时间: |
|
| 查看次数: |
61 次 |
| 最近记录: |