如何保持PHAsset.fetchAssets返回结果与标识符顺序一致?
保持PHAsset与标识符顺序一致的解决方案
PHAsset.fetchAssets(withLocalIdentifiers:options:)确实不会按照传入的标识符顺序返回资源——它内部是基于资源的存储属性(比如创建时间)来排序的,没有提供配置项直接指定按传入顺序返回。要保持顺序,最简单高效的方式是手动重新映射:
将返回的PHFetchResult转为字典
先把所有资产按localIdentifier作为key存入字典,这样可以实现O(1)时间复杂度的快速查找:var assetMap = [String: PHAsset]() fetchResult.enumerateObjects { asset, _, _ in assetMap[asset.localIdentifier] = asset }按原标识符顺序重新生成数组
利用上面的字典,遍历原始的identifiers数组,逐个取出对应的PHAsset,最终得到的数组顺序就和传入的标识符顺序完全一致:let orderedAssets = identifiers.compactMap { assetMap[$0] }
补充说明
- 不推荐逐个调用
PHAsset.fetchAssets获取单个资产,多次调用会带来额外性能开销,字典映射仅需一次fetch操作,效率更高。 - 如果部分标识符对应的资产已被删除,
compactMap会自动过滤掉nil值,最终数组仅包含存在的资产,且顺序与原标识符数组中有效项的顺序保持一致。
内容的提问来源于stack exchange,提问作者Nike Kov
相关产品推荐
相关产品推荐

