Exigence - J'ai un besoin dans lequel je reçois un dictionnaire JSON à partir duquel je récupère un tableau d'images et de texte de contenu. Ensuite, je dois afficher toutes les images avec le contenu correspondant dans une vue de collection.
Mise à jour - Avant tout, j'ai besoin de calculer la taille de la cellule en fonction de la taille de l'image mise à l'échelle à une largeur constante pour laquelle je pense que (peut être pas correct) j'ai besoin que toutes les images soient téléchargées complètement puis recharger la vue de la collection.
Problème - Mais le problème est que lorsque je télécharge les images en arrière-plan et que je les remplis dans des tableaux séparés, les images ne peuvent pas être ajoutées dans le même ordre qu'elles étaient dans le dictionnaire JSON puisque je les télécharge dans une file d'attente simultanée.
Ma solution - J'ai donc pensé à les télécharger en mettant tout dans une file d'attente en série, ce qui a rendu ma récupération de données très lente. Quelle peut être une alternative efficace pour cela ?
Code -
let serialQueue = dispatch_queue_create("my serial queue", nil)
dispatch_async(serialQueue, {
print("This is first Method")
for var i=0;i<self.resultArr.count;i++//resultArr is my array of data's in the jsonDic
{
sleep(2)
print(self.resultArr[i].valueForKey("profile_pic")! as! String)
if self.resultArr[i].valueForKey("profile_pic")! as! String != "Null" && self.resultArr[i].valueForKey("profile_pic")! as! String != "null" && self.resultArr[i].valueForKey("profile_pic")! as! String != "NULL" && self.resultArr[i].valueForKey("profile_pic")! as! String != ""
{
let imageUrl = UrlClass.imageUrlWithoutExtension + String(self.resultArr[i].valueForKey("profile_pic")!)
print(imageUrl)
let url = NSURL(string: imageUrl)
let imageData = NSData(contentsOfURL: url!)
self.contentlabelArr.insertObject(String(self.resultArr[i].valueForKey("content")!), atIndex: i)
if imageData != nil && imageData?.length > 0
{
print("this is \(i) image")
print(UIImage(data: imageData!))
self.imageArr.insertObject(UIImage(data: imageData!)!, atIndex: i)
}
else
{
print("\(i) image has nill")
self.imageArr.insertObject(UIImage(named: "logo.png")!, atIndex: i)
}
}
else
{
print("\(i) image has nill")
self.contentlabelArr.insertObject(String(self.resultArr[i].valueForKey("content")!), atIndex: i)
self.imageArr.insertObject(UIImage(named: "logo.png")!, atIndex: i)
}
print("\(i) times 5 is \(i * 5)")
if self.imageArr.count==self.resultArr.count
{
print(self.resultArr.count)
print(self.imageArr.count)
dispatch_async(dispatch_get_main_queue(),
{
print(self.resultArr.count)
print(self.imageArr.count)
print(self.imageArr)
print(self.contentlabelArr)
self.collectionView?.reloadData()
})
}