来自本地图库的tableView中的照片使用了太多RAM

时间:2016-06-15 14:59:18

标签: ios swift uitableview tableview alassetslibrary

当我尝试使用本地图库中的网址获取照片时,我使用ALAssetsLibrary()

将它们添加到tableView

我的代码:

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
}

我尽量减少照片的尺寸,它有点帮助但是如果我需要使用很多照片(10个或更多......)它就无法解决问题

1 个答案:

答案 0 :(得分:0)

什么是self.cachedImages。如果那是一本字典,那么你的代码将所有图像保存在内存中,当你滚动时,你的内存占用将会增长和增长。解决这个问题的最简单方法是完全删除缓存字典并每次从资产库加载图像,但这可能会很慢。

如果要缩放图像以在表格视图中显示它们,请加载资源,以目标大小打开图形上下文,以缩略图大小渲染图像,然后缓存缩略图图像。

您可能还会考虑使用NSCache,它就像字典一样,但在内存不足时管理刷新对象。