UIImageView,从远程URL加载UIImage

时间:2017-10-31 08:24:02

标签: ios swift url uiimageview uiimage

这个问题让我发疯了...... 我有这个字符串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,我可以正确看到图像!

4 个答案:

答案 0 :(得分:9)

您使用错误的方法来创建网址。请尝试URLWithString而不是fileURLWithPathfileURLWithPath用于从本地文件路径获取图像,而不是从互联网网址获取图像。

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)
}

答案 1 :(得分:4)

方法fileURLWithPath从文件系统打开文件。文件地址前缀为file://。您可以打印网址字符串。

关于+ (NSURL *)fileURLWithPath:(NSString *)path;

的Apple文档
  

NSURL对象将表示的路径。路径应该是有效的   系统路径,不能是空路径。如果路径以a开头   tilde,首先必须使用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:),那么这是最佳做法。

答案 2 :(得分:0)

这里的网址不是本地系统,而是服务器。

  let url = URL(fileURLWithPath: "http://verona-api.municipiumstaging.it/system/images/image/image/22/app_1920_1280_4.jpg")

此处创建的网址是设备本地的文件。 像这样创建网址: -

  url = URL(string: "http://verona-api.municipiumstaging.it/system/images/image/image/22/app_1920_1280_4.jpg") 

答案 3 :(得分:0)

使用下面的代码片段将图像加载到imageview中

 func imageDownloading() {

    DispatchQueue.global().async {

        let url = URL(string: "http://verona-api.municipiumstaging.it/system/images/image/image/22/app_1920_1280_4.jpg")!

        do {

            let data = try Data(contentsOf: url)

            DispatchQueue.main.async {

            self.imageView.image = UIImage(data: data)

            }

        } catch {
            print(error.localizedDescription)
        }
    }
}