这个问题让我发疯了...我有这个字符串url
:
“verona-api.municipiumstaging.it/system/images/image/image/22/app_1920_1280_4.jpg”,我必须在我的imageView
中加载此图像。
这是我的代码:
do {
let url = URL(fileURLWithPath: "http://verona-api.municipiumstaging.it/system/images/image/image/22/app_1920_1280_4.jpg")
let data = try Data(contentsOf: url)
self.imageView.image = UIImage(data: data)
}
catch{
print(error)
}
抛出异常:
没有相应的文件和目录。
但是,如果我用浏览器搜索这个url
,我可以正确地看到图像!
您使用错误的方法来创建URL。试试URLWithString
而不是fileURLWithPath
。 fileURLWithPath
用于从本地文件路径获取图像而不是从Internet URL获取图像。
要么
do {
let url = URL(string: "http://verona-api.municipiumstaging.it/system/images/image/image/22/app_1920_1280_4.jpg")
let data = try Data(contentsOf: url)
self.imageView.image = UIImage(data: data)
}
catch{
print(error)
}
方法fileURLWithPath
从文件系统打开文件。文件地址前面加上file://
。您可以打印网址字符串。
来自Apple有关+ (NSURL *)fileURLWithPath:(NSString *)path;
的文档
NSURL对象将表示的路径。 path应该是有效的系统路径,并且不能是空路径。如果path以波浪号开头,则必须首先使用stringByExpandingTildeInPath进行扩展。如果path是相对路径,则将其视为相对于当前工作目录。
以下是一些可能的解决方案之一:
let imageName = "http://verona-api.municipiumstaging.it/system/images/image/image/22/app_1920_1280_4.jpg"
func loadImage(with address: String) {
// Perform on background thread
DispatchQueue.global().async {
// Create url from string address
guard let url = URL(string: address) else {
return
}
// Create data from url (You can handle exeption with try-catch)
guard let data = try? Data(contentsOf: url) else {
return
}
// Create image from data
guard let image = UIImage(data: data) else {
return
}
// Perform on UI thread
DispatchQueue.main.async {
let imageView = UIImageView(image: image)
/* Do some stuff with your imageView */
}
}
}
loadImage(with: imageName)
如果你只是发送一个完成处理程序来执行主线程到loadImage(with:)
,这是最好的做法。
这里的url不是本地系统,而是服务器。
let url = URL(fileURLWithPath: "http://verona-api.municipiumstaging.it/system/images/image/image/22/app_1920_1280_4.jpg")
这里创建的url是文件,它位于设备本地。像这样创建网址: -
url = URL(string: "http://verona-api.municipiumstaging.it/system/images/image/image/22/app_1920_1280_4.jpg")