2016-11-19 91 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

可能你請檢查我的問題,請..我更新了我的代碼 –