You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何保持PHAsset.fetchAssets返回结果与标识符顺序一致?

保持PHAsset与标识符顺序一致的解决方案

PHAsset.fetchAssets(withLocalIdentifiers:options:)确实不会按照传入的标识符顺序返回资源——它内部是基于资源的存储属性(比如创建时间)来排序的,没有提供配置项直接指定按传入顺序返回。要保持顺序,最简单高效的方式是手动重新映射:

  1. 将返回的PHFetchResult转为字典
    先把所有资产按localIdentifier作为key存入字典,这样可以实现O(1)时间复杂度的快速查找:

    var assetMap = [String: PHAsset]()
    fetchResult.enumerateObjects { asset, _, _ in
        assetMap[asset.localIdentifier] = asset
    }
    
  2. 按原标识符顺序重新生成数组
    利用上面的字典,遍历原始的identifiers数组,逐个取出对应的PHAsset,最终得到的数组顺序就和传入的标识符顺序完全一致:

    let orderedAssets = identifiers.compactMap { assetMap[$0] }
    

补充说明

  • 不推荐逐个调用PHAsset.fetchAssets获取单个资产,多次调用会带来额外性能开销,字典映射仅需一次fetch操作,效率更高。
  • 如果部分标识符对应的资产已被删除,compactMap会自动过滤掉nil值,最终数组仅包含存在的资产,且顺序与原标识符数组中有效项的顺序保持一致。

内容的提问来源于stack exchange,提问作者Nike Kov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 03:57:32