我试图用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")
}
}如果还需要更多信息,请告诉我。谢谢!
发布于 2016-12-16 03:55:17
一般来说,你不希望自己加载大量的全尺寸或屏幕大小的图像并将它们保存在内存中。对于这种大小,您一次只能呈现一个(或者两个或三个,如果您想预加载屏幕过渡动画),所以您不需要一次获取更多。
同样,加载成百上千的缩略图并自己缓存它们会导致内存问题。(一次又一次地向reloadData告知您的集合视图也会导致大量的流失。)相反,让Photos框架来管理它们-它的功能是确保只有在需要的时候才会生成缩略图,并在两次使用之间进行缓存,甚至还可以帮助你完成一些任务,比如当用户在集合视图中滚动时,只抓取你需要的缩略图。
苹果的Using Photos Framework示例代码项目展示了获取图像的几个最佳实践。以下是一些要点的摘要:
管理缩略图集合视图的
AssetGridViewController,缓存了一个在初始化时提供给它的PHFetchResult<PHAsset>。有关fetch结果的信息(如其计数)是基本管理集合所需的全部信息,只有当集合视图要求显示一个单元格时,view.AssetGridViewController才会分别从PHImageManager请求缩略图。这意味着我们只在知道将要看到单元格时才创建UIImage,而不必告诉集合视图一遍又一遍地重新加载所有内容。就其本身而言,步骤2会导致缓慢的滚动,或者更确切地说,在滚动之后,会减慢图像加载到单元格的速度。因此,我们也这样做:
PHImageManager.default(),而是保留了PHCachingImageManager的一个实例,并在用户滚动时告诉它我们希望在缓存中“预热”哪组图像。AssetGridViewController有一些额外的逻辑来跟踪滚动视图的可视矩形,以便图像管理器知道为当前可见的项目准备缩略图(加上一点前滚),并可以在需要时释放资源用于不再可见的项目。请注意,预取不会创建UIImage,只是开始从磁盘或从iCloud下载所需的内容,因此内存使用量很小。
AssetViewController使用默认的PHImageManager来请求屏幕大小(而不是全尺寸)的图像。机会主义交付意味着我们将立即得到一个较低质量的版本(基本上与Photos之前在集合视图中使用时已经为我们缓存的缩略图相同),然后很快得到一个较高质量的版本(异步,之后我们会自动更新视图)。
如果你需要支持缩放(示例代码应用程序不支持缩放,但它很可能是一个真正的应用程序),你可以在进入全屏视图后立即请求全尺寸图像(代价是从放大的缩略图转换为全屏图像需要更长的时间),或者从请求屏幕大小的图像开始,然后请求全尺寸图像以便稍后交付。
发布于 2016-12-16 02:48:24
在CellForRowAtIndexPath中,使用PHImageManager的RequestImageForAsset方法延迟加载UIImageView上的图像属性。
https://stackoverflow.com/questions/34932772
复制相似问题