2

我希望用户能够访问他们所有的照片,但是一次加载它们需要太长时间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内容来说明要开始获取哪些资产吗?有没有更好的方法完全做到这一点?如果您需要我发布更多代码,请告诉我,并提前感谢您!

4

2 回答 2

0

可以参考 Apple WWDC Demo 代码:

使用照片框架的示例应用程序

它演示了如果用户滚动所有照片时如何处理。

在这个代码示例中,它有一个大于可见区域的“预热”区域,它将在前面缓存并在后面停止缓存。它会在滚动发生时计算并保持“预热”范围。然后它使用startCachingImagesstopCachingImagesAPI。因此,您将始终拥有手头的数据。

对您最有用的功能在此AssetGridViewController 文件中

于 2017-02-23T23:33:41.430 回答
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)
    
  • 此时您可以清除上一组资产。如果用户向上滚动 - 将 savefirstAssetDate与下一个谓词一起使用:

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

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

当然,这只是一个抽象的想法,但是,我认为,它可以很容易地结合您当前的代码来实现。

也不要忘记使用PHCachingImageManager来提高滚动性能。

于 2016-08-10T18:59:10.130 回答