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.
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 –
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. –
Obtenir des plantages sur des lignes * aléatoires *? Êtes-vous sûr que ce n'est pas un mauvais matériel? – dgatwood