我正面临一个问题,人们说应用程序在collectionView中加载照片库时崩溃。大多数时候,他们拥有2-3千多张照片。对我来说,一切正常。 (我的照片库中的照片不到1000张。)
问题:也许有什么方法可以显示收藏集中的图像查看更多“智能”并使用更少的内存吗?
P.S也许当用户的iCloud中所有照片也都可能导致崩溃时?因为到目前为止,我认为该应用程序在将其加载到单元格中时不会下载照片。也许有人可以证明或不同意这个事实。
这是我的职能:
func grabPhotos(){
let imgManager = PHImageManager.default()
let requestOptions = PHImageRequestOptions()
requestOptions.isSynchronous = false
requestOptions.deliveryMode = .opportunistic // Quality of images
requestOptions.isNetworkAccessAllowed = true
requestOptions.isSynchronous = true
requestOptions.progressHandler = { (progress, error, stop, info) in
print("progress: \(progress)")
}
let fetchOptions = PHFetchOptions()
fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
if let fetchResult : PHFetchResult = PHAsset.fetchAssets(with: .image, options: fetchOptions) {
if fetchResult.count > 0 {
for i in 0..<fetchResult.count {
imgManager.requestImage(for: fetchResult.object(at: i) , targetSize: CGSize(width: 150, height: 150), contentMode: .aspectFill, options: requestOptions, resultHandler: { image, error in
self.imageArray.append(image!)
self.kolekcija.reloadData()
})
}
}
else {
print("You got no photos")
kolekcija.reloadData()
}
}
}
答案 0 :(得分:2)
问题是这一行:
self.imageArray.append(image!)
从不制作图像阵列。图像非常大,您将耗尽内存。
这是一个集合视图。您只需按需提供itemForRowAt:
中的图像,然后提供的是图像的小版本(即所谓的 thumbnail ),该图像应尽可能小用于显示尺寸。因此,在任何时候,只有足够的缩略图可以填充可见屏幕;这样不会占用太多内存,而且当图像从屏幕上滚动时,运行时还可以释放图像内存。
这就是PHCachingImageManager的用途。在示例代码中仔细查看Apple如何处理此问题:
在该示例中,图像无处不在。