如何在 Swift 4.2 中使用 NSPredicate 仅从智能相册中获取图像资源?

How to fetch only image assets from smart albums with NSPredicate in Swift 4.2?

我想从用户 phone 上的所有智能相册中获取图像资源。目前我正在获取图片和视频,但这不是我想要的。

在我的研究中,我总是找到相同的解决方案,但它似乎不再有效,因为问题已经存在好几年了。所以我找不到任何最新的解决方案。

这是我找到的解决方案

let fetchOptions = PHFetchOptions()
fetchOptions.predicate = NSPredicate(format: "mediaType = %d", PHAssetMediaType.image.rawValue)

let smartAlbums = PHAssetCollection.fetchAssetCollections(with: .smartAlbum, subtype: .any, options: fetchOptions)
let fetchAssetsResult = PHAsset.fetchAssets(in: collection, options: fetchOptions)

执行这行代码时,我收到以下错误消息

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unsupported predicate in fetch options: mediaType == 1'

是否有任何新的工作解决方案?

试试,

let albumName = "Your Album Name" or "Your Album Local Identifier"
let fetchOptions = PHFetchOptions()
fetchOptions.predicate = NSPredicate(format: "title = %@", albumName)
let fetchResult: PHFetchResult = PHAssetCollection.fetchAssetCollections(with: .album, subtype: .any, options: fetchOptions)

支持的键是,

详情请参考PHFetchOptions

在 Bappaditya 的帮助下,我发现我在错误的资产获取上使用了谓词。 mediaType 密钥仅用于 PHAsset.fetchAsset() 而不是用于 PHAssetCollection.fetchAssetCollection(),因为我正在使用它。

此代码现在有效

let fetchOptions = PHFetchOptions()
let smartAlbums = PHAssetCollection.fetchAssetCollections(with: .smartAlbum, subtype: .any, options: fetchOptions)

fetchOptions.predicate = NSPredicate(format: "mediaType == %d", PHAssetMediaType.image.rawValue)
let fetchAssetsResult = PHAsset.fetchAssets(in: collection, options: fetchOptions)