我的捕获不适用于 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.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 返回主线程。我猜。
我正在尝试在 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.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 返回主线程。我猜。