如何筛选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
相关产品推荐
相关产品推荐

