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

时间:2018-12-30 11:39:34

标签: ios swift swift4 ios11 ios12

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

在我的研究中,我总是找到相同的解决方案,但由于问题已有数年之久,它似乎不再起作用。所以我找不到任何最新的解决方案。

这是我找到的解决方案

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'

有什么新的可行解决方案吗?

2 个答案:

答案 0 :(得分:3)

在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)

答案 1 :(得分: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)

支持的键是

Image

有关更多详细信息,请参阅PHFetchOptions