![](/img/trans.png)
[英]How to add pagination to PHAsset fetching from Photos Framework?
[英]Fetching thumbnails from PHAsset
我正在尝试从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
}
})
}
}
在此阶段,我有两个问题:
在这两个问题上的任何投入将不胜感激。
由于某种原因,它做了两次工作
因为那是应该做的。 如您所知,从照片库中获取图像需要花费时间。 因此,默认行为是我们尽快提供低分辨率图像,以便您可以显示一些内容。 然后,我们可能会多次调用图像质量更高的版本。 而且,提取是异步形成的。 因此,完全有可能最终同时发生多个获取请求,这可能导致您的代码开始踩到自己的脚,正如您所发现的那样。
如果您不喜欢这样,请将fetch选项synchronous
设置为true
,但是您必须在后台队列中进行整个调用! 通过在串行队列中执行此操作,可以确保依次依次执行调用,并且每个图像将仅发送一次。 此外,然后(并且仅在那时)您的PHImageRequestOptions.DeliveryModeFastFormat
将被遵守。 在对收到的图像进行任何处理之前,请不要忘记退回到主线程!
您也可以使用我写的这个扩展名:
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
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.