【问题标题】:Swift fetchAssetsInAssetCollection: Loading Photos From Range in Camera RollSwift fetchAssetsInAssetCollection:从相机胶卷范围内加载照片
【发布时间】:2016-08-10 16:35:31
【问题描述】:

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

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

这是我当前代码的 sn-p(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 中添加一些内容来说明要开始获取哪些资产吗?有没有更好的方法完全做到这一点?如果您需要我发布更多代码,请告诉我,并提前感谢您!

【问题讨论】:

    标签: ios swift phasset photolibrary phfetchoptions


    【解决方案1】:

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

    • 当第一批获取的资产向下滚动时,您应该获得第一个资产的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 和谓词中的 &lt; 比较。

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

    别忘了使用PHCachingImageManager 来提高滚动性能。

    【讨论】:

      【解决方案2】:

      可以参考Apple WWDC Demo代码:

      Example app using Photo framework

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

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

      这个AssetGridViewController file对你最有用的功能

      【讨论】:

        猜你喜欢
        • 2017-12-06
        • 2011-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-08
        • 1970-01-01
        相关资源
        最近更新 更多