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

如何筛选Photos Library中含编辑记录的PHAssets?解决查询崩溃问题

解决PHAsset无法用hasAdjustments筛选的问题

直接在NSPredicate里用hasAdjustments会崩溃,因为Photos框架的PHFetchOptions只支持特定的可查询属性,hasAdjustments不在这个列表里,没法直接作为筛选条件。

正确的做法是先获取所有目标类型的资产,再在内存里筛选:

步骤1:先获取所有图片资产

先去掉hasAdjustments的条件,正常fetch所有图片:

let allPhotosOptions = PHFetchOptions()
allPhotosOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: true)]
allPhotosOptions.predicate = NSPredicate(format: "mediaType = %d", PHAssetMediaType.image.rawValue)
allPhotosOptions.includeAssetSourceTypes = [.typeUserLibrary, .typeiTunesSynced, .typeCloudShared]

let allPhotos = PHAsset.fetchAssets(with: allPhotosOptions)

步骤2:在内存中筛选已编辑/未编辑的资产

遍历fetch结果,通过hasAdjustments属性过滤:

  • 筛选已编辑的照片:
var editedAssets: [PHAsset] = []
allPhotos.enumerateObjects { asset, _, _ in
    if asset.hasAdjustments {
        editedAssets.append(asset)
    }
}
// editedAssets就是所有已编辑的图片资产
  • 筛选未编辑的照片,把判断改成反向即可:
var uneditedAssets: [PHAsset] = []
allPhotos.enumerateObjects { asset, _, _ in
    if !asset.hasAdjustments {
        uneditedAssets.append(asset)
    }
}
// uneditedAssets就是所有未编辑的图片资产

补充说明

如果资产数量极大,可考虑分批遍历优化,但绝大多数场景下,内存里的直接筛选完全够用。

内容的提问来源于stack exchange,提问作者J. Coder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 21:52:36