如何为从照片框架获取的 PHAsset 添加分页?

Posted

技术标签:

【中文标题】如何为从照片框架获取的 PHAsset 添加分页?【英文标题】:How to add pagination to PHAsset fetching from Photos Framework? 【发布时间】:2017-12-22 05:19:39 【问题描述】:

我正在尝试使用 Photos 框架从 cameraRoll 获取所有照片,但是从 cameraRoll 获取所有照片需要花费大量时间。

他们无论如何都要为其添加分页吗? 所以我可以在滚动时获取。

 var images = [UIImage]()
 var assets = [PHAsset]()

fileprivate func assetsFetchOptions() -> PHFetchOptions 
    let fetchOptions = PHFetchOptions()

    //fetchOptions.fetchLimit = 40 //uncomment to limit photo

    let sortDescriptor = NSSortDescriptor(key: "creationDate", ascending: false)
    fetchOptions.sortDescriptors = [sortDescriptor]
    return fetchOptions


fileprivate func fetchPhotos() 
    let allPhotos = PHAsset.fetchAssets(with: .image, options: assetsFetchOptions())

    DispatchQueue.global(qos: .background).async 
        allPhotos.enumerateObjects( (asset, count, stop) in
            //print(count)

            let imageManager = PHImageManager.default()
            let targetSize = CGSize(width: 200, height: 200)
            let options = PHImageRequestOptions()
            options.isSynchronous = true
            imageManager.requestImage(for: asset, targetSize: targetSize, contentMode: .aspectFit, options: options, resultHandler:  (image, info) in

                if let image = image 
                    self.images.append(image)
                    self.assets.append(asset)
                

                if count == allPhotos.count - 1 
                    DispatchQueue.main.async 
                        self.collectionView?.reloadData()
                    
                

            )

        )
    

【问题讨论】:

不要一次性获取所有照片。随着图库中图像数量的增加,肯定会花费更多时间。因此,仅在需要时才开始获取图像,就像 SDWebImages 一样。编写获取代码在 UICollectionView 数据源方法的 cellForItemAtIndexPath 中。每个单元格只获取一张图像。 通过使用 objects(at:) 我在滚动时获取图像。谢谢 分享代码帮助他人 【参考方案1】:

allPhotos 是PHFetchResult 类型,这是一个惰性集合,即它实际上不会出去获取照片,直到您要求它,这就是.enumerateObjects 正在做的事情。您可以使用subscript operator 一次抓取一张照片,或者使用objects(at:) 获取一系列对象,以便根据需要翻阅照片集。

【讨论】:

你能解释一下我们将如何使用对象(at:) 来分页

以上是关于如何为从照片框架获取的 PHAsset 添加分页?的主要内容,如果未能解决你的问题,请参考以下文章

iOS 8 照片框架:从 PHAsset 获取文件名

如何从视频 URL 获取视频的 PHAsset?

如何从 MacOS 的照片库中获取所有 PHAsset

PHAsset 无法获取

获取 PHAsset 的本地文件路径

从 PHAsset 获取已编辑照片的 URL