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

ant*_*n68 4 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)
Run Code Online (Sandbox Code Playgroud)

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

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unsupported predicate in fetch options: mediaType == 1'
Run Code Online (Sandbox Code Playgroud)

有什么新的工作解决方案吗?

ant*_*n68 7

在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)
Run Code Online (Sandbox Code Playgroud)

  • 完美,我只需要找到视频,它也运行良好。 (2认同)