2016-11-19 12 views
1

私は私が私が私のコードを再利用したいが、私は残念ながら、私は自分の目標を達成することはできません、それを表示するための画像がコードを働いているダウンロードしますが、ここでコードの重複の多くウェブから画像をダウンロードする方法は?

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

たいのiOSに新しいです。エラーはなく、URLは正しい。毎回その声明が出ます。私は何かが欠けているが、それは何ですか?

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 
    } 

注:

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

は、ここに私の方法であり、私はわからない、それが最善の方法ですか。それがベストプラクティスでない場合は、私を案内すること自由に感じて

答えて

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

Dude。非同期と同期のコードについては、いくつかのスタッフを習得する必要があります。 ここに事があります。あなたのコード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") 
      } 
     }) 
     ... 
    } 

あなたが迅速に非同期コードやウェブについてのいくつかのチュートリアルをお読みください。このsite

+0

あなたは私の質問をチェックすることができますが..私は私のコード –

0

downlaodImage()

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

は、常にあなたの応答データが戻ってくる前に、プログラムの実行が継続したために失敗しようとしている非同期に画像をダウンロードしてあなたが開始することができます。

downlaodImage()のパラメータをのパラメータに追加することで、以下のように、コールバック関数のクロージャの画像をdownlaodImage()に設定する方が簡単です。この方法では、elseブロックをdownlaodImage関数に移動することによって、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 
} 

簡体コードなし/場合は、他のブロック

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

可能性を更新してください。私のコードを更新しました。 –

関連する問題