2016-11-19 1 views
1

Je suis nouveau à iOS je veux télécharger l'image pour l'afficher est le code de travail, mais ici beaucoup de duplication de codeComment télécharger une photo depuis le web?

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

Je veux réutiliser mon code, mais je malheureusement je ne peux pas atteindre mon but. il n'y a pas d'erreur et l'URL est correcte. à chaque fois va déclaration autre. il me manque quelque chose mais qu'est-ce que c'est?

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

Voici ma méthode:

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 
    } 

Note: Je ne suis pas sûr qu'il est mieux ou non. si ce n'est pas la meilleure pratique, n'hésitez pas à me guider.

Répondre

1

Il n'y a pas besoin de tant de tracas. Vous avez le URL de l'image de sorte que vous pouvez simplement télécharger l'image à partir du URL. Par exemple:

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

Edit: Pour réutiliser ce code, je vous suggère d'utiliser l'extension de UIImageView.Voici un exemple:

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

Utilisez cette méthode chaque fois que vous souhaitez définir l'image d'un imageView d'un url comme celui-ci:

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

pourriez-vous vérifier ma question s'il vous plaît .. J'ai mis à jour mon code –

+0

avez-vous vérifié la bibliothèque [SDWebImage] (https://github.com/rs/SDWebImage)? – Adeel

+0

non monsieur. n'est-il pas possible sans 3ème partie –

0

Mec. Vous devriez apprendre du personnel sur le code asynchrone et le code de synchronisation. Voici la chose. Code en vous downloadImage fonctionne de manière synchrone, de sorte qu'il vous passez URLTask et allez tout droit de retour, là vous retournez image variable, ce qui est nul. L'une des solutions pour utiliser le bloc de rappel comme celui-ci:

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

Et puis l'utiliser comme ceci:

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

Vous devriez lire quelques tutoriels sur le code et async web rapide. Vous pouvez commencer par ce site

+0

Pourriez-vous vérifier ma question s'il vous plaît .. Je mis à jour mon code –

0

downlaodImage() télécharge une image de façon asynchrone

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

va toujours à l'échec parce que l'exécution du programme a continué avant que vos données de réponse est revenu. Il serait plus facile de définir vos images dans la fonction de rappel downlaodImage() comme ci-dessous en ajoutant un paramètre UIImageView à downlaodImage(). De cette façon, vous pouvez réduire la répétition des blocs if else en les déplaçant vers la fonction 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 
} 

code simplifié sans if/else blocs

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

pourrait vous vérifiez ma question s'il vous plaît .. J'ai mis à jour mon code –