Anforderung- Ich habe eine Verpflichtung, in dem ich von dem ein JSON-Wörterbuch erhalte ich eine Reihe von Bildern und Informationen Text am abruft. Dann muss ich alle Bilder mit entsprechenden Inhalten in einer Sammlungsansicht anzeigen.Herunterladen von Bildern in Serie in einer seriellen Warteschlange sehr langsam
Update - Vor allem ich brauche die Zellengröße zu berechnen, basierend auf Bildgröße an die eine konstante Breite skaliert, für die ich fiel, dass (möglicherweise nicht korrekt) Ich brauche alle Bilder vollständig heruntergeladen werden dann neu zu laden Sammlung Ansicht
Problem - Aber das Problem ist, dass wenn ich die Bilder im Hintergrund-Thread zu downloaden und zu bevölkern in separaten arrays.Then das Bild kann nicht in derselben Reihenfolge hinzugefügt werden, wie sie im JSON Dictionary waren, da ich das herunterladen bin sie in einer gleichzeitigen Warteschlange.
Meine Lösung - Also überlegte ich, sie herunterzuladen, indem ich alles in eine serielle Warteschlange stellte, was meine Daten sehr langsam gemacht hat. Was kann eine effiziente Alternative dafür sein?
-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()
})
}
Natürlich es langsam ist, da Sie in jeder Iteration 2 Sekunden Wartezeiten. Es wird dringend empfohlen, 'NSURLSession' und' NSOperationQueue' wie im Beispielcode von Apple statt 'NSData (contentsOfURL:)' – vadian
@vadian zu verwenden. Aber ich brauche alle Bilder, um in der gleichen Reihenfolge in der resultArr zu kommen. NSUrlSession ist standardmäßig asynchron und Prozess sollte in der gleichzeitigen Warteschlange ausgeführt werden, aber wenn ich das gleichzeitig tue, stört die Reihenfolge des Bildes im Array.Also wäre jeder Code oder Empfehlungen sehr hilfreich. –
Setzen Sie die Eigenschaft 'maxConcurrentOperationCount' von' NSOperationQueue' auf '1' und Sie erhalten die gleiche Reihenfolge. Oder wie in Olegs Antwort erwähnt, verwenden Sie ein Datenmodell mit einer benutzerdefinierten Klasse, dann spielt die Download-Reihenfolge keine Rolle. – vadian