Swift fetchAssetsInAssetCollection:从相机胶卷中的范围加载照片

时间:2016-08-10 16:35:32

标签: ios swift phasset photolibrary phfetchoptions

我希望用户能够访问他们的所有照片,但是使用PHAsset.fetchAssetsInAssetCollection一次加载所有照片的时间太长,特别是如果他们有500张照片(我在集合视图中显示它们)在定制的视图中)。当用户到达集合视图的末尾以加载下一组时,我正在考虑使用scrollViewDidScroll,但我不知道如何从照片库中获取下一个x金额。

我使用fetchOptions.fetchLimit = x限制了他们可以获得的照片数量,但我不知道如何告诉函数从何处开始获取资源。有可能吗?

以下是我当前代码的片段(assetCollections设置在代码的不同部分):

let fetchOptions = PHFetchOptions()
fetchOptions.predicate = NSPredicate(format: kFormatOfPredicate, PHAssetMediaType.Image.rawValue)
fetchOptions.sortDescriptors = [NSSortDescriptor(key: kSortByCreationDateString, ascending: false)]
fetchOptions.fetchLimit = 32

//Only want camera roll
if assetCollection.localizedTitle == kCameraRollString {
assets = PHAsset.fetchAssetsInAssetCollection(assetCollection, options: fetchOptions)
if assets.count > 32 {
    for i in 0..<32 {
        if let asset = assets[i] as? PHAsset {
            appendImageArray(assetToBeChanged: asset)
        }
    }
} else {
    for i in 0..<assets.count {
        if let asset = assets[i] as? PHAsset {
            appendImageArray(assetToBeChanged: asset)
        }
    }
}

有什么我可以添加到我的fetchOptions来说明要开始获得哪些资产?有没有更好的方法来做到这一点?如果您需要我发布更多代码,请告诉我,并提前感谢您!

1 个答案:

答案 0 :(得分:0)

我知道如何实现这一目标:

  • 当第一批获取的资产向下滚动时,您应该获得第一个资产的creationDate。假设你会这样做:

    let firstAsset = assets[0] as! PHAsset
    // The first asset date will be used when scrolling up.
    firstAssetDate = firstAsset.creationDate
    
  • 现在要获取另一组资产,您可以使用当前的排序描述符配置获取选项(按降序排序日期排序):

    fetchOptions.sortDescriptors = [NSSortDescriptor(key: kSortByCreationDateString, ascending: false)] 
    

    和以下谓词(根据当前上一个资产日期仅获取最新资产):

    let lastAsset = assets[assets.count - 1] as! PHAsset
    fetchOptions.predicate = NSPredicate(format: "(mediaType == %d) AND (creationDate < %@)", PHAssetMediaType.Image.rawValue, lastAsset.creationDate)
    
  • 此时您可以清除上一组资产。如果用户向上滚动 - 将保存的firstAssetDate与下一个谓词结合使用:

    fetchOptions.predicate = NSPredicate(format: "(mediaType == %d) AND (creationDate <= %@)", PHAssetMediaType.Image.rawValue, firstAssetDate) 
    

    如果用户向下滚动 - 使用当前获取数组中最后一个资源的creationDate和谓词中的<比较。

当然,这只是一个抽象的概念,但我认为它可以很容易地与您当前的代码一起实现。

另外,请不要忘记使用PHCachingImageManager来提高滚动性能。