如何从网上下载图片?

时间:2016-11-19 13:24:27

标签: ios swift

我是iOS的新手我希望下载图片显示它是工作代码,但这里有很多代码重复

0.18

所以我想重用我的代码但不幸的是我无法实现我的目标。没有错误,网址是正确的。每次都是别的陈述。我错过了什么,但那是什么?

let url = URL(string: iteminfo.imageUrl!)
    let urlRequest = URLRequest(url: url!)
    let task = URLSession.shared.dataTask(with: urlRequest) { (data, response, error) in
        if error != nil {
            print(error)
        }
        if let data = data {
            print(data)
            self.imageViewItemPic.image  = UIImage(data: data)
        }
    }
    task.resume()
    let url2 = URL(string: iteminfo.cookerProfilePicUrl!)
    let urlRequest2 = URLRequest(url: url2!)
    let task2 = URLSession.shared.dataTask(with: urlRequest2) { (data, response, error) in
        if error != nil {
            print(error)
        }
        if let data = data {
            print(data)
            self.imageViewCookerProfilePic.image  = UIImage(data: data)
        }
    }
    task2.resume()

这是我的方法:

        if let image = downlaodImage(urlImage: iteminfo.imageUrl){
            print("first \(image)")
              imageViewItemPic.image = image

        }else{
           print("first wrong......")
        }
        if let image =  downlaodImage(urlImage:  iteminfo.cookerProfilePicUrl){
            print("second \(image)")
             imageViewCookerProfilePic.image = image
        }
        else{
            print("second wrong......")
        }

注意:我不确定这是不是最好的方式。如果不是最佳实践,请随时指导我

3 个答案:

答案 0 :(得分:1)

多德。您应该了解一些有关异步和同步代码的工作人员。 这就是事情。您downloadImage中的代码同步工作,因此它会通过URLTask并直接返回,在那里您返回image变量,即nil。 使用回调块的解决方案之一如下:

func downloadImage(urlImage : String?, complete: ((UIImage?)->Void)? = nil){

    let url = URL(string: urlImage!)
    let urlRequest = URLRequest(url: url!)
    let task = URLSession.shared.dataTask(with: urlRequest) { (data, response, error) in

        if let data = data {
           complete?(UIImage(data: data))
        }
    }
    task.resume()
}

然后像这样使用它:

    { ...
        downloadImage(urlImage: "", complete: { image in
            if let image = image{
                self.imageViewItemPic.image = image
            }else{
                print("no image")
            }
        })
      ...
    }

你应该在swift中阅读一些关于异步代码和web的教程。你可以从这个site

开始

答案 1 :(得分:1)

没有必要那么麻烦。您拥有图片的URL,因此您只需从URL下载图片即可。例如:

func downloadImage(imageURL: String) {

    DispatchQueue.global().async {

        let data = NSData.init(contentsOf: NSURL.init(string: imageURL) as! URL)
        DispatchQueue.main.async {

            let image = UIImage.init(data: data as! Data)
            imageView.image = image
        }
    }
}

修改:要重复使用此代码,我建议使用UIImageView的扩展名。这是一个例子:

extension UIImageView {

    func setImageFromURL(url: String) {

        DispatchQueue.global().async {

            let data = NSData.init(contentsOf: NSURL.init(string: url) as! URL)
            DispatchQueue.main.async {

                let image = UIImage.init(data: data as! Data)
                self.image = image
            }
        }
    }
}

如果您想从imageView设置url的图像,请使用此方法:

self.imageViewCookerProfilePic.setImageFromURL(url: "https://encrypted-tbn1.gstatic.com/images?q=tbn:ANd9GcQNpKmjx1w3DRDZ9IXN81-uhSUA6qL6obkOthoUkb9RZkXf5pJ8")

答案 2 :(得分:0)

downlaodImage()异步下载图像

if let image = downlaodImage(...) { ... }

总是会失败,因为在您的响应数据恢复之前程序执行仍在继续。

通过向downlaodImage()添加UIImageView参数,在downlaodImage()的回调函数闭包中设置图像会更容易。这样,您可以通过将if移动到downlaodImage函数来减少if else块的重复。

func downlaodImage(urlImage : String?, imageView: UIImageView) -> UIImage?{
    var image : UIImage?
    let url = URL(string: urlImage!)
    let urlRequest = URLRequest(url: url!)

    let task = URLSession.shared.dataTask(with: urlRequest) { (data, response, error) in

        if let data = data {
           // print(data)

        if let image = UIImage(data: data) {
            imageView.image = image
        } else {
            print("failed to load image")
        }





        }
    }
    task.resume()
    return image
}

没有if / else块的简化代码

downlaodImage(urlImage: "https://encrypted-tbn1.gstatic.com/images?q=tbn:ANd9GcQNpKmjx1w3DRDZ9IXN81-uhSUA6qL6obkOthoUkb9RZkXf5pJ8", imageView: imageViewItemPic)

downlaodImage(urlImage: "https://www.dominos.co.nz/ManagedAssets/OLO/eStore/all/Product/NZ/P015/P015_ProductImage_Small_en_Default_20140203_105245.png", imageView: imageViewCookerProfilePic)