我正在尝试从PHAsset获取缩略图以及其他一些信息。
对于我从相机卷检索的所有图像做:
static func fetchAsset(asset: PHAsset)
{
if(asset.mediaType == PHAssetMediaType.Image){
let screenScale: CGFloat = UIScreen.mainScreen().scale
let imageSize = CGSize(width: 100 * screenScale, height: 100 * screenScale)
let options: PHImageRequestOptions = PHImageRequestOptions()
options.deliveryMode = PHImageRequestOptionsDeliveryMode.FastFormat
options.resizeMode = PHImageRequestOptionsResizeMode.Fast
options.synchronous = false
PHImageManager.defaultManager().requestImageForAsset(asset,
targetSize: imageSize,
contentMode: PHImageContentMode.AspectFill,
options: options,
resultHandler: { (result, info) -> Void in
if (result != nil && result!.scale == screenScale) {
var newItemImage = MyImage(isLocal:true)
if let fname = asset.valueForKey("filename") as? String{
newItemImage.fileName = fname
}
newItemImage.thumbnail = result
asset.requestContentEditingInputWithOptions(PHContentEditingInputRequestOptions()) { (contentEditingInput, info) -> Void in
//Get full image
let url = contentEditingInput!.fullSizeImageURL
newItemImage.url = url
}
//DO SOMWTHING WITH IMAGE
}else
{
//DO SOMWTHING ELSE
}
})
}
}
我现在有两个问题:
1.最重要的一个,但我想这是必然的。它需要太多的处理能力和从光盘阅读。它在模拟器中工作正常。但当我运行它在测试设备(iPhone 5,4 S),有300-500张图像,它会冻结一两分钟,同时获取所有的图像。我猜它会一个接一个地阅读整个集合,调整它的大小,并获取所有这些信息。有没有更简单的方法?就像它是可能的与ALAsset,我可以只得到缩略图直接和它飞得很快。
1.由于某种原因,它做了两次。第一次,它给了我我所要求的,小缩略图~ 60 * 40或左右。一旦它给了我,几秒钟后,它进入另一个循环,并开始检索更高分辨率的图像,如960 * 640或左右,这就是冻结发生。我不知道为什么会发生这种情况,但它确实发生了。
对这两个问题的任何投入都将受到高度赞赏。
2条答案
按热度按时间hl0ma9xz1#
出于某种原因它做了两次工作
因为这是它应该做的。从照片库中获取图像需要时间,正如您所发现的。因此,默认行为是我们尽可能快地提供低分辨率图像,这样您就可以显示一些内容;然后,我们会再次调用,可能是多次,并使用质量更好的图像版本。此外,获取是异步形成的。因此,完全有可能一次发生多个获取请求,这可能会导致代码开始绊倒自己的脚,正如您所发现的。
如果你不喜欢这样,可以把fetch选项
synchronous
设置为true
--但是你必须在后台队列中进行整个调用!通过在一个 serial 队列中这样做,你可以确保调用是依次单独执行的,并且每个图像只被传递一次。此外,然后(也只有这样)你的PHImageRequestOptions.DeliveryModeFastFormat
才会被执行。不要忘记在处理你收到的图像之前回到主线程!fivyi3re2#
你也可以使用我写的这个扩展: