Предупреждения памяти iOS
Я пытаюсь заполнить представление коллекции изображениями, загруженными из базы данных Parse, но я получаю предупреждения памяти, сопровождаемые случайными сбоями. Кто-нибудь знает, как другие приложения могут представить так много изображений без сбоев? Может кто-нибудь показать мне, как оптимизировать то, что у меня уже есть? Вот весь соответствующий код: https://gist.github.com/sungjp/99ae82dca625f0d73730
var imageCache : NSCache = NSCache()
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
self.imageCache.removeAllObjects()
}
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
//In storyboard, my collection view cell has the identifier "PostCell"
let cell = collectionView.dequeueReusableCellWithReuseIdentifier("PostCell", forIndexPath: indexPath) as! CollectionViewCell
//I have an array called "posts" that's filled with PFObjects that have UIImage data
let postings: PFObject = posts[indexPath.row]
//setting my cell's string property called "objectId" to the PFObject's ID for the purpose of caching shown below
cell.objectId = postings.objectId! as String
let theImage: AnyObject = postings["imageFile"] as! PFFile
if let image = self.imageCache.objectForKey(postings.objectId!) as? UIImage {
cell.imageView.image = image
println("had this photo in cache")
} else {
theImage.getDataInBackgroundWithBlock { (imageData: NSData?, error: NSError?) -> Void in
if error != nil {
println("error caching or downloading image")
return
}
let cellImage = UIImage(data:imageData!, scale: 1.0)
self.imageCache.setObject(cellImage!, forKey: postings.objectId!)
cell.imageView.image = cellImage
println("just added another photo to cache")
}
}
return cell
}
class CollectionViewCell: UICollectionViewCell {
var objectId: String!
}
1 ответ
Решение
- Как сказал @Adrian B: читайте об инструментах.
- Вы можете уменьшить масштаб изображений перед их сохранением или сохранить дополнительную уменьшенную копию для отображения в виде таблицы. Это зависит от того, насколько хорошие изображения вам нужны - предположительно для табличного представления не такого большого размера, как полноразмерные изображения с МБ данных. На самом деле, изображения также будут выглядеть лучше, если они будут правильно масштабированы. Это само по себе должно позаботиться о задержках.
- У вас есть стратегия кэширования onw, но если вы хотите улучшить производительность, попробуйте SDWebImage (см.: https://github.com/rs/SDWebImage). Эта библиотека кэширует изображения и загружает их асинхронно.