Swift:从照片库中获取资产,排除子类型



>我想从照片库中获取资产列表,但从智能文件夹中排除子类型或资产,例如 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. 我只能为屏幕截图和实时照片添加 PHAssetMediaSubtype,但不能为连拍照片添加。

我知道有方法

if let collection = PHAssetCollection.fetchAssetCollections(with: .smartAlbum, 
   subtype: .smartAlbumBursts, options: nil).firstObject {

但我不确定如何使用该 metdhod 或亚型来实现我的目的

正在尝试使用代表突发但崩溃:

let predicateType = NSPredicate(format: "representsBurst == %@", NSNumber(value: false))

原因:"提取选项中不支持的谓词:表示突发 == 0">

请参考PHFetchOptions支持的谓词和排序描述符键表。

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

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)

NSPredicate 很棘手。说"不"的方式是这样的:

NSPredicate(
    format: "!((assetCollectionSubtype & %d) == %d)",
        PHAssetCollectionSubtype.smartAlbumBursts.rawValue)

最新更新