gpt4 book ai didi

ios - 使用 PHAsset 检索多个图像

转载 作者:行者123 更新时间:2023-11-29 01:17:56 24 4
gpt4 key购买 nike

我正在尝试使用 PHAsset 从用户的相机胶卷中检索超过 1,000 张图像,但如果它只是缩略图,它最终会崩溃或花费很长时间。这是我检索图像的功能...

func retrieveImages(thumbnail: Bool) {

/* Retrieve the items in order of modification date, ascending */
let options = PHFetchOptions()
options.sortDescriptors = [NSSortDescriptor(key: "modificationDate",
ascending: false)]

/* Then get an object of type PHFetchResult that will contain
all our image assets */
let assetResults = PHAsset.fetchAssetsWithMediaType(.Image,
options: options)

let imageManager = PHCachingImageManager()

assetResults.enumerateObjectsUsingBlock{(object: AnyObject!,
count: Int,
stop: UnsafeMutablePointer<ObjCBool>) in


if object is PHAsset{
let asset = object as! PHAsset
print("Inside If object is PHAsset, This is number 1")

var imageSize: CGSize!

if thumbnail == true {
imageSize = CGSize(width: 100, height: 100)

} else {
imageSize = CGSize(width: self.cameraView.bounds.width, height: self.cameraView.bounds.height)

}
/* For faster performance, and maybe degraded image */
let options = PHImageRequestOptions()
options.deliveryMode = .FastFormat
options.synchronous = true

imageManager.requestImageForAsset(asset,
targetSize: imageSize,
contentMode: .AspectFill,
options: options,
resultHandler: { (image, _: [NSObject : AnyObject]?) -> Void in
if thumbnail == true {
self.libraryImageThumbnails.append(image!)
self.collectionTable.reloadData()
} else {
self.libraryImages.append(image!)
self.collectionTable.reloadData()

}
})

/* The image is now available to us */

print("enum for image, This is number 2")



print("Inside If object is PHAsset, This is number 3")
}
print("Outside If object is PHAsset, This is number 4")

}



}

如果需要更多信息,请告诉我。谢谢!

最佳答案

通常您不想加载大量全尺寸或屏幕尺寸的图像并自己将它们保存在内存中。对于该尺寸,您一次只能呈现一个(如果您想预加载屏幕转换动画,则可以呈现两个或三个),因此您不需要一次获取更多。

同样,加载数百或数千个缩略图并自行缓存它们会导致内存问题。 (一遍又一遍地告诉你的 Collection View reloadData 也会导致很多流失。)相反,让照片框架管理它们——它具有确保缩略图仅在需要时生成并在使用之间缓存的功能,并且甚至可以帮助您完成任务,例如当用户在 Collection View 中滚动时仅抓取您需要的缩略图。

Apple 的 Using Photos Framework示例代码项目展示了几种获取图像的最佳实践。以下是一些要点的摘要:

  1. AssetGridViewController ,管理缩略图的 Collection View ,缓存 PHFetchResult<PHAsset>这是在初始化时给它的。有关获取结果的信息(如其计数)是 Collection View 的基本管理所需的全部信息。

  2. AssetGridViewControllerPHImageManager 请求缩略图单独地,仅当 Collection View 要求显示单元格时。这意味着我们只创建一个 UIImage当我们知道将要看到一个单元格时,我们不必告诉 Collection View 一遍又一遍地重新加载所有内容。

就其本身而言,第 2 步会导致滚动变慢,或者更确切地说,会导致在滚动后缓慢追赶加载到单元格中的图像。所以,我们也这样做:

  1. 而不是使用 PHImageManager.default() ,我们保留一个 PHCachingImageManager 的实例,并告诉它我们想要在用户滚动时“预热”缓存的图像集。

    AssetGridViewController有一些额外的逻辑来跟踪 ScrollView 的可见矩形,以便图像管理器知道为当前可见的项目准备缩略图(加上一点点向前滚动),并且可以为不再可见的项目释放资源它需要。请注意,预取不会创建 UIImage s,只是开始必要的从磁盘加载或从 iCloud 下载,所以你的内存使用量保持很小。

  2. 在收藏 View 中选择一个项目(以全屏显示该照片),AssetViewController使用默认 PHImageManager请求屏幕大小(非全尺寸)的图像。

    机会性交付意味着我们将立即获得较低质量的版本(基本上与照片在 Collection View 中为我们缓存的缩略图相同),并在不久之后获得更高质量的版本(异步地,之后我们会自动更新 View )。

    如果您需要支持缩放(该示例代码应用程序不支持,但它可能是一个真正的应用程序),您可以在进入全屏 View 后立即请求全尺寸图像(费用为从放大的缩略图过渡到全屏图像需要更长的时间),或者先请求屏幕大小的图像,然后再请求全尺寸图像以供稍后交付。

关于ios - 使用 PHAsset 检索多个图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34932772/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com