2016-11-19 114 views
1

我是新来的iOS我想下载的图像显示,它正在重复代码如何从网上下载图片?

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

这里是我的方法:

func downlaodImage(urlImage : String?) -> 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) 

      image = UIImage(data: data) 


      } 
     } 
     task.resume() 
     return image 
    } 

注:我不知道是不是最好的方法还是不行。如果不是最佳实践,请随时引导我

回答

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

使用,每当你想从一个url这样设置imageView的图像此方法:

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

你可以检查我的问题..我更新了我的代码 –

+0

你检查了[SDWebImage](https://github.com/rs/SDWebImage)库吗? – Adeel

+0

不,先生。是不是没有第三方 –

0

伙计。您应该了解一些关于异步和同步代码的工作人员。 这是事。代码downloadImage同步工作,所以它通过你URLTask并直接返回,在那里你返回你image变量,即零。 在一个像这样利用回调块的解决方案:

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

你应该了解在迅速异步代码和web一些教程。你可以开始与这个site

+0

你可以检查我的问题,请..我更新了我的代码 –

0

downlaodImage()下载图像异步所以

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

总是要失败,因为程序执行继续您的响应数据已经回来了。

它会更容易只是增加一个UIImageView参数downlaodImage()设置你的图像的downlaodImage()如下回调函数关闭。这样,通过将其移动到downlaodImage函数,可以减少其他块的重复。

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 
} 

简化代码,而如果/ 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) 
+0

可能你请检查我的问题,请..我更新了我的代码 –