2017-03-17 2 views
0

Ich benutze Firebase, um Bilder für meine App zu hosten und herunterzuladen. Jedes Bild auf Firebase reicht von 200 KB bis 400 KB, und der Benutzer lädt etwa 12 gleichzeitig herunter, wenn er durch eine CollectionView blättert. Wenn ich den VC starte, der die Bilder herunterlädt, geht meine App von der Verwendung von ungefähr 100 MB Speicher zu 650 MB Speicher von dem Herunterladen von 19 Bildern insgesamt. Die Bilder in Fragen sind JPEGs und wurden ziemlich stark komprimiert, bevor sie in Firebase hochgeladen werden. Diese Bilder werden in einem NSCache gespeichert, und wenn der Cache gelöscht wird, wird die Speicherbelegung wieder auf etwa 100 MB reduziert.Bilder, die von Firebase heruntergeladen werden, nehmen irgendwie 28 MB Speicher ein Stück, wenn sie nur 200-400kb groß sind

Was ist los? Hier ist ein Code, der

Klasse TripOverviewCell helfen ?: kann: UICollectionViewCell {

@IBOutlet weak var imageView: UIImageView! 

func updateUI(photo:Photo, image:UIImage? = nil) { 
    //Call when preparing to show image 
    if image != nil { 
     print("Loaded from cache") 
     imageView.image = image 
     photo.assignImage(image: image!) 
    } else { 
     let url = photo.imageUrl 
     let ref = FIRStorage.storage().reference(forURL: url) 
     ref.data(withMaxSize: 5*1024*1024, completion: { [weak self] (data, error) in 
      if error != nil { 
       print("Unable to download image") 
      } else { 
       print("Image downloaded") 
       if let imageData = data { 
        if let image = UIImage(data: imageData) { 
         self?.imageView.image = image 
         photo.assignImage(image: image) 
         TripsVC.imageCache.setObject(image, forKey: photo.uid as NSString) 
        } 
       } 
      } 
     }) 
    } 
} 
} 
+1

Wenn Sie über die Speichernutzung in der App sprechen, beziehen Sie sich auf RAM richtig? Nur weil ein Bild 200kb ist, bedeutet das nicht, dass es 200kb RAM verwendet, um es anzuzeigen –

+0

Das ist richtig, RAM. Natürlich verstehe ich, dass es mehr Ressourcen verwenden muss, um es anzuzeigen, aber bis zu 1500x die Größe des Bildes? Darüber hinaus ist die Größe des Caches selbst etwa 550 MB von 19 Bildern. Wenn Sie den Cache löschen, wird er auf 100 MB RAM zurückgesetzt. –

+0

Um ein Bild anzuzeigen, muss es von den gespeicherten Bytes in die angezeigten Pixel konvertiert werden. Wenn Sie also ein 3000x2000 Bild haben, das Sie auf 200Kb komprimiert haben, muss es noch in 6 Megapixel dekomprimiert werden. Wenn jedes Pixel 4 Byte (rgba) ist, sind das 24 MB. Lade 19 davon und du kommst in den groben Bereich, von dem du sprichst. –

Antwort

0

Wie Frank kommentierte angezeigten Bilder viel mehr Platz einnehmen als nur die Daten für die Bilder. Mein Fehler lag in der Tatsache, dass ich UIImagages caching, das ist das vollständig angezeigte Bild. Stattdessen hätte ich die Daten zwischenspeichern und dann aus diesen Daten Bilder erstellen sollen, wo ich sie brauche. Die Speicherauslastung ist von 550 MB auf etwa 20 MB reduziert.

Verwandte Themen