我想在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 {...}
但它说它总是返回假......
任何帮助将不胜感激
答案 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.serviceArray[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返回主线程。我想。