2016-11-22 10 views
0

Ich möchte mehrere URLs von String im Array herunterladen und Bilder in collectionView anzeigen. Es gelingt mir, vier Bilder anzuzeigen (4 sichtbare Zellen auf meinem Bildschirm) und wenn ich scrolle, beginnt das Herunterladen der 2 anderen Bilder.Swift - AlamofireImage mehrere URLs herunterladen und in CollectionView anzeigen

Ich möchte, dass diese 6 Bilder in der gleichen Zeit heruntergeladen werden (und ich muss nicht für den Beginn der anderen Download scrollen). Danach möchte ich die Gesamtzeit anzeigen, die ich für das Herunterladen und Anzeigen von Bildern in meinem collectionView benötigt habe.

Was mache ich falsch?

Hier ist mein Code:

import UIKit 
import AlamofireImage 
import Alamofire 

class ViewController: UIViewController,UICollectionViewDelegate,UICollectionViewDataSource { 

    var players = [ 
     ["image_Name":"https://images.unsplash.com/photo-1420768255295-e871cbf6eb81?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&s=4b94ef340bd7f6cac580fbc76af326af"], 
     ["image_Name":"https://images.unsplash.com/photo-1465411801898-f1a78de00afc?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&s=149d27223217c0fa63c7dd8f1e8d23f6"], 
     ["image_Name":"https://images.unsplash.com/photo-1466853817435-05b43fe45b39?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&s=a3b629b7e0c4f710ce119f219ae5b874"], 
     ["image_Name":"https://images.unsplash.com/photo-1467404899198-ccadbcd96b91?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&s=66eef8db7a0aa4119c6c8d7ba211f79f"], 
     ["image_Name":"https://images.unsplash.com/photo-1470322346096-ecab3914cab7?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&s=83863ba23662871baf6434c6000e00bd"], 
     ["image_Name":"https://images.unsplash.com/photo-1473624566182-509e437512f4?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&s=54c3ec6d1fee824d62e6fa76676ddf17"] 
    ] 
    var methodStart = Date() 

    @IBOutlet weak var mycall: UICollectionView! 
    var selectedIndex=[Int]() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 


    func numberOfSections(in collectionView: UICollectionView) -> Int { 
     return 1 
    } 

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
     return self.players.count 
    } 

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
     let cell:playerCell = collectionView.dequeueReusableCell(withReuseIdentifier: "playerCell", for: indexPath) as! playerCell 

     let url = URL(string:self.players[indexPath.row]["image_Name"]!) 
     if indexPath.row == 0 { 
      methodStart = Date() 
     } 
     Alamofire.request(url!).responseImage { response in 
      //   debugPrint(response) 
      //   print(response.request) 
      //   print(response.response) 
      //   debugPrint(response.result) 

      if let image = response.result.value { 
       cell.playerImage.image = image 
      } 
     } 

     if indexPath.row == self.players.count - 1 { 
      let methodFinish = NSDate() 
      let executionTime = methodFinish.timeIntervalSince(methodStart as Date) 
      print("Execution time: \(executionTime)") 
     } 

     return cell 
    } 
} 
+0

nach dem Download, Bild in Hauptwarteschlange und setneedslayout Eigenschaft für Bild zu aktualisieren – Vinodh

Antwort

1

Problem in Ihrem Code -

Sie sagten, Sie diese 6 Bilder wollen zur gleichen Zeit und wenn der Benutzer scrollt die 5. und 6. Bild heruntergeladen werden sollte sofort angezeigt werden. aber das passiert nicht, weil die cellForItemAtIndexPath-Funktion für die 5. und 6. Zelle beim Scrollen aufgerufen wird. Dies ist das Standardverhalten und Sie können dies nicht vor dem Scrollen des Benutzers aufrufen.

schnelle Lösung -

Downloads all Bilder außerhalb cellForItemAtIndexPath Funktion, wie in entweder viewDidLoad oder viewDidAppear durch das Array von Spielern Looping und dann nach Abschluss des Download der letzten die Sammlung Ansicht neu zu laden.

Permanent und beste Lösung -

Implementieren verzögertes Laden und Caching von Bildern entweder Heneke oder SDWebImage mit Bild in Zellen anzuzeigen. Verwenden Sie in diesen Bibliotheken die Option prefetch, um Bilder abzurufen, bevor sie in Zellen angezeigt wurden. Um die Prefetch-Option zu verwenden, müssen Sie das Array durchlaufen und die URLs an die Abruf- und Speicherfunktionen der Bibliothek übergeben und das Bild in der Zelle entsprechend der Syntax dieser Bibliothek laden. Es wird die Anzeige des Bildes beim Herunterladen und Sie verwalten Ich muss mir deswegen keine Sorgen machen.

1

Wenn Sie mit Netzwerkanrufen zu tun haben, sollten Sie die Benutzeroberfläche in der Hauptwarteschlange aktualisieren. Ein weiterer gültiger Punkt, den ich hinzufügen möchte, ist Alamofire hat eine spezielle Bibliothek zum Herunterladen/Ändern der Größe. Bitte schauen Sie sich AlamofireImage Library

Alamofire.request(url!).responseImage { response in 
      if let image = response.result.value { 
       DispatchQueue.main.async { 
        cell.playerImage.image = image 
        cell.playerImage.setNeedsLayout() 
       } 
      } 
     } 
Verwandte Themen