我的捕获不适用于 url 请求

My catch isn't working on url request

我正在尝试在 Swift 中进行第一次尝试。

本质上,用户可以给某物命名。所以说 he/she 在 Gmail 中键入并点击提交。

由于 G 是字符串的第一个字母(不管是小写还是大写)图像将加载 G 的图片。

如果用户还添加了 URL,比如 gmail.com 或 www.gmail.com,它将拉取 gmail 的图标。

到目前为止一切顺利。

然而。如果此人键入 gmailllllll.com

它会加载一张地球仪图片(我认为这是默认设置)

我想做的只是将 gmail 图标放在图像视图中(如果它确实是图像的话)。如果它是 nil 那么我想把我提供的 G 的图像。

我明白为什么我的代码不起作用。我只是不知道如何添加它来做我想做的事。

 DispatchQueue.main.async {
  let myURLString: String = "http://www.google.com/s2/favicons?domain=\(self.serviceArray[row].serviceUrl)"
  let myURL = URL(string: myURLString)
  do {
    let myData = try Data(contentsOf: myURL!)


    cell.serviceLogoImage.image = UIImage(data: myData)

  } catch {
    cell.serviceLogoImage.image = UIImage.init(named: "\(self.getLetterOrNumberAndChooseImage(text: self.serviceArray[row].serviceName))")
  }

}

此外,如果用户输入 www.go google.com space 它有一个可选的崩溃!

我试着说

if myData == nil {...}

但它总是说 returns 错误...

如有任何帮助,我们将不胜感激

可选绑定

此解决方案通过可选绑定避免了强制展开(即 myURL!)。

请注意,try? returns 是可选的。它 returns nil 而不是抛出错误。当您想以相同的方式处理所有错误时,这是​​合适的。

let myURLString: String = "http://www.google.com/s2/favicons?domain=\(self.serviceArray[row].serviceUrl)"
if let myURL = URL(string: myURLString), let myData = try? Data(contentsOf: myURL), let image = UIImage(data: myData) {
    cell.serviceLogoImage.image = image
}
else {
    cell.serviceLogoImage.image = UIImage.init(named: "\(self.getLetterOrNumberAndChooseImage(text: self.serviceArray[row].serviceName))")
}

这个表达式 Data(contentsOf: myURL!) 不安全。我认为您希望它会引发错误,但如果 URL 无法解析,它只会让您的代码崩溃(按设计)。这是一个安全的例子:

    if let url = URL(string:mystring) {
       do { 
        let data = try Data(contentsOf:url)
       } catch {
        print ("network issue")
       }
    } else {    
       print("bad string") 
    }

首先,永远不要使用!除非你确定有一个值而不是 nil 因为强制解包会使你的整个应用程序崩溃。其次,我真的不明白你想用那个 Dispatch 做什么。我的意思是,如果用户点击提交,你应该创建一个函数,当提交按钮被点击时你会调用它。 我会这样写:

    func updateImage() {
          var myData: Data?

          let myURLString: String = "http://www.google.com/s2/favicons?domain=\(self.serviceArra‌​y[row].serviceUrl)"
          let myURL = URL(string: myURLString)
          if let url = myURL {
              do {
                  myData = try Data(contentfOf: url)
              } catch {
                  print("error")
              }
          }
          if let data = myData {
              cell.serviceLogo.image = UIImage(data: data)
          } else {
              cell.serviceLogo.image = UIImage.init(named: "\(self.getLetterOrNumberAndChooseImage(text: self.serviceArray[row].serviceName))")
      }

我真的不知道你在用那个 Dispatch 尝试什么,但最终我认为你应该首先使用 Dispatch.global(qos: .background).async 你首先要验证的地方用户输入的内容并最终下载必要的照片,然后,当您尝试更新 UI 时,您应该使用 Dispatch.main.async 返回主线程。我猜。