2016-09-06 1 views
0

Dans mon projet, je montre des données dans UItableView à partir de l'appel d'une API, ma tableView contient imageView, et pour son je reçois l'URL de l'image.Comment afficher les données dans UITableView qui obtiennent ses données à partir de 2 API différentes

J'ai fait 2 appels: async

1) Pour extraire toutes les données de api qui contient également img URL

NSURLSession.sharedSession().dataTaskWithURL(url!, completionHandler: 
    { 
    (data,response,error) -> Void in 

    if error == nil && data != nil 
    { 
     do 
     { 
     let data1 = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as! NSMutableArray 


      dispatch_async(dispatch_get_main_queue()) 
      { 
       // Here calling protocol and reloading UItable View 
       self.userInfoDelegate?.setUserInfo(data1) 
      } 
     } 
     catch 
     { 
      print("Something Went Wrong in REST") 

     } 
    } 

}).resume() 

Jusqu'à ici, je suis peuplant le texte nécessaire de UITableView. Maintenant, je dois que ImageView dans le tableau devrait également montrer des images de imagUrl De première API

Je fais un appel asynchrone pour aller chercher des images pour l'URL

func setUserInfo(data : NSMutableArray) { 
    var indexOf = 0 

    self.userTableView.reloadData() 
    for item in data 
    { 
     imageFromUrl(indexOf,urlString: to_pic,name:name) 
     indexOf = indexOf + 1 

    } 

} 

Voici le code à partir de laquelle je reçois NSData d'images et de stockage d'image sur UITableView quand il obtenir des données

func imageFromUrl(index : Int,urlString: String,name : String) 
{ 
    if let url = NSURL(string: urlString) { 
     let request = NSURLRequest(URL: url) 
     let config = NSURLSessionConfiguration.defaultSessionConfiguration() 
     let session = NSURLSession(configuration: config) 
     let task = session.dataTaskWithRequest(request, completionHandler: {(data, response, error) in 
      if let imgData = data 
      { 
       var image = UIImage?() 
       image = UIImage(data: imgData) 
       self.placeImage = image 

      } 

      if(self.placeImage == nil) 
      { 
       self.placeImage = UIImage(named: "User-2") 
      } 

      self.imageDictionary[index] = ["id":index,"image":self.placeImage!] 
      // ANother Asynch 
      dispatch_async(dispatch_get_main_queue()) 
      { 
       if(self.imageDictionary.count == self.userArray.count) 
       { 
        for var newIndex in 0...self.imageDictionary.count - 1 
        { 
         self.setImageOnTableWithIndex(newIndex) 
        } 
       } 
      } 
     }); 

     // do whatever you need with the task e.g. run 
     task.resume() 
    } 
} 

func setImageOnTableWithIndex(index : Int) 
{ 
    let indexPath = NSIndexPath(forRow: index, inSection: 0) 

    let cell = userTableView.cellForRowAtIndexPath(indexPath) as! UserListTableViewCell; 

    cell.userImageView.image = self.imageDictionary[index]!["image"] as? UIImage 
} 

il montre parfois l'image correctement, mais la plupart du temps se plantage en ligne au hasard. Je sais que je dois traiter correctement de nombreux appels asynchrones, mais pas en mesure de trouver la bonne façon.

+1

vous pouvez appeler anthères Api après avoir obtenu une réponse de la première api et maintenez cette donnée dans un tableau –

+0

Au lieu de télécharger l'image de cette façon, utilisez 'SDWebImage'. En outre, il fonctionne de manière Loader Lazy, donc pas besoin de télécharger toute l'image en même temps, à la place, il va télécharger l'image qui s'affiche actuellement à l'écran. –

+0

Obtenir des plantages sur des lignes * aléatoires *? Êtes-vous sûr que ce n'est pas un mauvais matériel? – dgatwood

Répondre