我尝试从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
}
})
}
}
我现阶段遇到两个问题:
对这两个问题的任何意见都将受到高度赞赏。
答案 0 :(得分:2)
由于某种原因它完成了两次工作
因为那是它应该做的事情。正如您所发现的那样,从照片库中获取图像需要时间。因此,默认行为是我们尽快提供低分辨率图像,这样您就可以显示某些内容;然后,我们再次使用质量更好的图像再次调用几次。而且,提取是异步形成的。因此,完全有可能最终同时发生多次获取请求,这可能导致您的代码开始磕磕绊绊,正如您所发现的那样。
如果您不喜欢,请将抓取选项synchronous
设置为true
- 但是您必须在后台队列中进行整个调用!通过在串行队列中执行此操作,您可以确保依次单独执行调用,并且每个图像将仅传送一次。而且,那时(并且只有那时)你的PHImageRequestOptions.DeliveryModeFastFormat
将被遵守。在对您收到的图片做任何事情之前,不要忘记退回主线程!
答案 1 :(得分:0)
你也可以使用我写的这个扩展名:
import Photos
extension PHAsset {
var thumbnailImage : UIImage {
get {
let manager = PHImageManager.default()
let option = PHImageRequestOptions()
var thumbnail = UIImage()
option.isSynchronous = true
manager.requestImage(for: self, targetSize: CGSize(width: 300, height: 300), contentMode: .aspectFit, options: option, resultHandler: {(result, info)->Void in
thumbnail = result!
})
return thumbnail
}
}
}