我的问题是没有处理网址请求

时间:2017-02-07 02:24:16

标签: swift favicon

我想在Swift中尝试第一次尝试catch。

基本上,用户可以给某事物命名。所以说他/她在Gmail中输入并点击提交。

由于G是字符串的第一个字母(如果它的大小写无关紧要),图像将加载G的图片。

如果用户还添加了一个URL,那么请说gmail.com或www.gmail.com,它会为gmail提取favicon。

到目前为止一切顺利。

但是。如果此人键入gmailllllll.com

它会加载地球的图片(我认为是默认设置)

我想要做的只是将gmail图标放在图像视图中,如果它实际上是图像。如果它是零,那么我想把我提供的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 有空间它有一个可选的crashe!

我试着说

if myData == nil {...}

但它说它总是返回假......

任何帮助将不胜感激

3 个答案:

答案 0 :(得分:1)

可选绑定

此解决方案避免使用可选绑定强制解包(即myURL!)。

请注意,try?会返回一个可选项。它返回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))")
}

答案 1 :(得分:0)

此表达式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") 
    }

答案 2 :(得分:0)

首先,永远不要使用!除非您确定有值而不是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返回主线程。我想。