gpt4 book ai didi

swift - 用矩检索 PHAssets 的性能

转载 作者:行者123 更新时间:2023-11-28 14:29:59 25 4
gpt4 key购买 nike

我目前正在将用户照片库构建到应用中。到目前为止,我只是在 UICollectionView 中列出了所有用户的照片。现在我想将时刻集群添加为部分,类似于 iOS 照片应用。

我在做什么(有点简化):

let momentClusters = PHCollectionList.fetchMomentLists(with: .momentListCluster, options: options)
momentClusters.enumerateObjects { (momentCluster, _, _) in
let moments = PHAssetCollection.fetchMoments(inMomentList: momentCluster, options: nil)
var assetFetchResults: [PHFetchResult<PHAsset>] = []
moments.enumerateObjects { (moment, _, _) in
let fetchResult = PHAsset.fetchAssets(in: moment, options: options)
assetFetchResults.append(fetchResult)
}
//save assetFetchResults somewhere and use it in UICollectionView methods
}

事实证明,这比我之前做的要耗费更多的时间 - 最多一分钟,而我的 iPhone X(有大约 15,000 张图片的画廊)大约需要 2 秒。显然,这是 Not Acceptable 。

为什么抓取时刻的性能如此糟糕,我该如何改进?我使用的 API 有误吗?

我尝试按需加载 Assets ,但这非常困难,因为我必须处理每时每刻的估计项目数,并在用户滚动时重新加载部分 - 我无法以这样的方式工作令人满意(平滑滚动,没有明显的重新加载)。

有什么帮助吗?这个 API 应该如何工作?我是不是用错了。

更新/部分解决方案

所以在尝试之后,事实证明以下是问题的主要部分:我正在使用带有排序描述符的选项获取 Assets :

let options = PHFetchOptions()
options.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: true)]
options.predicate = NSPredicate(format: "mediaType = %d", PHAssetMediaType.image.rawValue)
let assets = PHAsset.fetchAssets(in: moment, options: options)

排序似乎不允许 PhotoKit 使用其内部的索引或缓​​存。删除 sortDescriptors 可显着加快提取速度。它仍然比以前慢,欢迎任何进一步的提示,但这使得加载时间更容易忍受。

请注意,如果没有排序描述符, Assets 将首先返回最旧的 Assets ,但这可以通过在 cellForItemAt: 中以相反顺序检索 Assets 来轻松手动修复(因此 处的单元格0,0 将获得第一时刻的last Assets )

最佳答案

免责声明:与性能相关的答案必然是推测性的...

您描述了两个极端:

  • 在显示集合之前预取所有时刻的所有 Assets
  • 延迟获取所有 Assets ,使用估计计数并重新加载

但也有介于两者之间的选择。例如,您可以一开始只获取时刻,然后让 Collection View 驱动每个时刻获取 Assets 。但是与其等到片刻可见再获取内容,不如使用 UICollectionViewDataSourcePrefetching决定在这些项目在屏幕上可见之前开始获取什么的协议(protocol)。

关于swift - 用矩检索 PHAssets 的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51329822/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com