我想从照片库中获取资产列表,但从诸如smartAlbumBursts,smartAlbumLivePhotos,smartAlbumScreenshots等智能文件夹中排除子类型或资产

我的代码是

let options = PHFetchOptions()
options.sortDescriptors = [ NSSortDescriptor(key: "creationDate", ascending: true) ]
options.predicate = predicate
let assets = PHAsset.fetchAssets(with: PHAssetMediaType.image, options: options)

我试图做这样的谓词:
let predicateType = NSPredicate(format: "mediaSubtypes != %@",
   PHAssetMediaSubtype.photoScreenshot as! CVarArg)

但是1.崩溃。2.我只能为截图和livePhoto添加PHAssetMediaSubtype,而不能为连拍照片添加PHAssetMediaSubtype。

我知道有方法
if let collection = PHAssetCollection.fetchAssetCollections(with: .smartAlbum,
   subtype: .smartAlbumBursts, options: nil).firstObject {

但是我不确定如何为我的目的使用该方法或子类型

试图使用representsBurst但崩溃了:
let predicateType = NSPredicate(format: "representsBurst == %@", NSNumber(value: false))

原因:“提取选项中不支持的谓词:representsBurst == 0”

最佳答案

请参考 PHFetchOptions supported predicate and sort descriptor keys表。

我假设如果资产不代表爆发,那么它就没有爆发标识符。您可以根据需要将其组合:

let options = PHFetchOptions()
options.sortDescriptors = [ NSSortDescriptor(key: "creationDate", ascending: true) ]

// fetch all images with no burstIdentifier
options.predicate = NSPredicate(format: "burstIdentifier == nil")
var assets = PHAsset.fetchAssets(with: PHAssetMediaType.image, options: options)

// fetch all images with photoScreenshot media subtype
options.predicate = NSPredicate(format: "((mediaSubtype & %d) != 0)", PHAssetMediaSubtype.photoScreenshot.rawValue)
assets = PHAsset.fetchAssets(with: PHAssetMediaType.image, options: options)

// fetch all images with photoLive media subtype
options.predicate = NSPredicate(format: "((mediaSubtype & %d) != 0)", PHAssetMediaSubtype.photoLive.rawValue)
assets = PHAsset.fetchAssets(with: PHAssetMediaType.image, options: options)

// fetch all non-photoScreenshot and non-photoLive images
options.predicate = NSPredicate(format: "NOT (((mediaSubtype & %d) != 0) || ((mediaSubtype & %d) != 0))", PHAssetMediaSubtype.photoScreenshot.rawValue, PHAssetMediaSubtype.photoLive.rawValue)
assets = PHAsset.fetchAssets(with: PHAssetMediaType.image, options: options)

// fetch all non-photoScreenshot and non-photoLive images with no burstIdentifier
options.predicate = NSPredicate(format: "NOT (((mediaSubtype & %d) != 0) || ((mediaSubtype & %d) != 0)) && burstIdentifier == nil", PHAssetMediaSubtype.photoScreenshot.rawValue, PHAssetMediaSubtype.photoLive.rawValue)
assets = PHAsset.fetchAssets(with: PHAssetMediaType.image, options: options)

09-06 20:57