2016-06-15 6 views
0

Wenn ich versuche, Fotos bekommen Sie eine URL von einem lokalen Galerie mit ich sie zu einem Tableview hinzufügen mit ALAssetsLibrary()Fotos in Tableview von lokalen Galerie verwendet zu viel RAM

Mein Code:

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

    var cell: AllPhotosTableViewCell! 
    cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! AllPhotosTableViewCell 

    let url = array[indexPath.section]["photos"] as! [AnyObject] 

    if let image = cachedImages[url[indexPath.row] as! String] {   
     cell.imageViewImg.image = imageResize(image, sizeChange: CGSize(width: 50, height: 50)) 
    } else { 

     let nsURL = NSURL(string: url[indexPath.row] as! String)! 
     var loadError: NSError? 

     asset.assetForURL(nsURL, resultBlock: { (asset) -> Void in 

      if let ast = asset { 
       let image = UIImage(CGImage: ast.defaultRepresentation().fullResolutionImage().takeUnretainedValue()) 
       self.cachedImages[url[indexPath.row] as! String] = image 

       dispatch_async(dispatch_get_main_queue(), { 

        cell.imageViewImg.image = self.imageResize(image, sizeChange: CGSize(width: 50, height: 50)) 

       }) 
      } 
     }, failureBlock: {(error) -> Void in 
      loadError = error 
     }) 
    } 

    return cell 
} 

Ich versuche, um die Größe von Fotos zu minimieren, hilft es ein wenig, aber es löst nicht das Problem, wenn ich viele Fotos (10 oder mehr ...) verwenden muss

+2

Wenn Sie diese Bilder aus der Datei laden, müssen Sie sie nicht zwischenspeichern ... Und Sie müssen sie wirklich nicht in voller Größe zwischenspeichern ... – Putz1103

+0

Nicht genau das Problem aber verwandt: AssetsLibrary ist seit veraltet iOS 8. Verwenden Sie stattdessen Photos.framework oder Sie werden große Probleme mit Benutzern haben, die iCloud Photo Library oder andere neue Funktionen verwenden. – rickster

Antwort

0

Was ist self.cachedImages. Wenn das ein Wörterbuch ist, dann hält Ihr Code ALLE Ihre Bilder im Speicher, und wenn Sie scrollen, wird Ihr Speicherbedarf wachsen und wachsen. Am einfachsten wäre es, das Cache-Dictionary vollständig zu entfernen und die Bilder jedes Mal aus der Asset-Bibliothek zu laden, aber das könnte langsam sein.

Wenn Sie Ihre Bilder skalieren, um sie in einer Tabellenansicht anzuzeigen, laden Sie das Asset, öffnen Sie einen Grafikkontext mit der Zielgröße, rendern Sie das Bild mit Ihrer Miniaturgröße und speichern Sie das Miniaturbild zwischen.

Sie können auch mit NSCache suchen, die wie ein Wörterbuch funktioniert, aber Spülen von Objekten verwaltet, wenn der Speicher knapp wird.

Verwandte Themen