2016-05-14 7 views
2

Ich benutze die Haneke-Bibliothek zum Download, laden & Cache-Bilder. Dies funktioniert hervorragend, außer wenn zu schnell gescrollt wird, lädt es das falsche Bild oder manchmal überhaupt kein Bild.Swift - UITableView - Falsche Bilder laden beim schnellen Scrollen

Es scrollt schneller als es im Hintergrund herunterladen kann, so dass das nächste Bild in der Warteschlange in die falsche Zelle geladen werden kann.

Hier ist der Code zum Anfordern der Bilder über das Netzwerk & aus dem Cache.

let fetcher_net = NetworkFetcher<UIImage>(URL: finished_URL!) 
     let fetcher_disk = DiskFetcher<UIImage>(path: check_apost) 
     cache.fetch(fetcher: fetcher_disk).onSuccess { image in 
      //cell.card_imageIV.hnk_fetcher.cancelFetch() 
      //print("Image Cache found") 
      cell.card_imageIV.image = image 
      }.onFailure{ image in 
       //print("Unavailable to find image cache, fetching from network") 
       cache.fetch(fetcher: fetcher_net).onSuccess { image in 
        //print("Network image request SUCCESS") 
        cell.card_imageIV.image = image 
       } 
     } 

Auch in der benutzerdefinierten Zelle Swift-Datei, gibt es alles, was ich in dem folgenden Verfahren stellen kann, die jede Anforderung zu stoppen, wenn die Zellen aus dem Bildschirm sind?

override func prepareForReuse() { 
    super.prepareForReuse() 
    // Increment the generation when the cell is recycled 

    //card_imageIV.hnk_cancelSetImage() 
    //card_imageIV.image = nil 
} 

Ich habe versucht, dies seit Wochen herauszufinden. Wenn jemand über bessere Bibliotheken verfügt, um dieses Problem zu beheben, lassen Sie es mich wissen.

Antwort

1

Was ich mache, ist meine Bilder in einem Bild-Cache so zu speichern.

 private var imageCache = [String:UIImage]() 

Einmal habe ich mein Bild geholt (n) aus, wo immer ich speichere die UIImage in meinem Imagecache-Array.

 self.imageCache["myImageFilename-01"] = img 
    self.imageCache["myImageFilename-02"] = img2 
    etc.... 

Dann speicher ich den Dateinamen in meine Zelle Daten Obj.

//Basic structure example. 
class myData: NSObject 
    { 
    var imageFilename : String? 
    var titleText : Double? 
    etc... 
    } 

Speichern Sie die Daten in Obj und speichern Sie Obj in Array. Dies wird später zum Abrufen Ihrer Daten verwendet.

let newObj = myData() 
    newObj.imageFilename = "myImageFilename-01" 
    newObj.titleText = "some title text" 
    myDataArray.append(newObj) 

Dann können Sie das Bild so einstellen.

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    let cell = tableView.dequeueReusableCellWithIdentifier("TableCell", forIndexPath: indexPath) as! MyCustomCellClass 

    //I like to clear the image. Just incase. Not sure it is needed to do. 
    cell.myCellImage.image = nil //Or what ever you have wired up. 

    //Get the data from your array of myDataArray 
    let rowData = myDataArray[indexPath.row] 

    cell.myCellImage.image = self.imageCache[rowData.imageFilename] 

    //Set the rest of your cell stuff 

    return cell. 
    } 

Das sollte Sie in die richtige Richtung gehen. Ich denke, dass es einige Syntaxprobleme geben könnte, schrieb ich dies auf einem Computer ohne Xcode. Glückliche Kodierung.

Verwandte Themen