如果没有互联网连接,IOS 应用程序会在一行代码上崩溃,我该如何防止这种情况发生

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)

Pau*_*w11 5

简短的回答是不要使用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此功能相关的信息以避免冲突。

网络的使用也不是特别有效;假设这是表格或集合视图的一部分,单元格在视图滚动时被重用。发生这种情况时,您将重复获取相同的图像。某种本地缓存会更有效。

如果可以在您的项目中使用外部框架(即您的雇主没有明确禁止它),那么我强烈建议您查看像SDWebImageKingFisher这样的框架。他们将使这项任务变得更容易和更有效率。