我需要创建一个过滤的smartAlbums集合,以便在UITable中显示。 我之前尝试过各种方法将未经过滤的集合转换为可变形式,并删除我想要排除的那些,然后重铸回PHFetchResult。所有这些尝试都失败了。
我现在正尝试使用PHFetch选项来过滤相册,其中包含" localizedTitle"这是特别允许的(https://developer.apple.com/documentation/photos/phfetchoptions)。但是,当我尝试以下测试用例代码试图排除"视频"智能文件夹,我在newAlbums中得到零计数结果。当我将谓词设置为%K ==%@时,我也得到零结果。正确的答案应该是前者为15,后者为1。为什么我的谓词未能选择正确的结果?我不希望将新集合保存回库中,只是将它用于临时显示,所以我没有尝试Request调用(也许我误解了这里的框架?)
我搜索了S / O和developer.apple,唯一的工作代码示例是过滤单个媒体(照片或视频),而不是选择smartAlbums。
let fetchOptions = PHFetchOptions()
let p1 = NSPredicate(format: "%K == %@", "localizedTitle", "Videos")
fetchOptions.predicate = p1
let newAlbums = PHAssetCollection.fetchAssetCollections(with: .smartAlbum, subtype: .albumRegular, options: fetchOptions)
答案 0 :(得分:0)
这是我发现的一种方法,我已经验证了它的工作原理。非常感谢迈克尔https://stackoverflow.com/a/46145638/4945371
首先添加这个小方法,它不返回PHCollectionList,而是返回数组!
private func fetchSmartCollections(with: PHAssetCollectionType, subtypes: [PHAssetCollectionSubtype]) -> [PHAssetCollection] {
var collections:[PHAssetCollection] = []
let options = PHFetchOptions()
options.includeHiddenAssets = false
for subtype in subtypes {
if let collection = PHAssetCollection.fetchAssetCollections(with: with, subtype: subtype, options: options).firstObject {
collections.append(collection)
}
}
return collections
}
然后创建所需智能相册的数组:
let subtypes:[PHAssetCollectionSubtype] = [
.smartAlbumFavorites,
.smartAlbumLongExposures,
.smartAlbumSelfPortraits,
.smartAlbumRecentlyAdded
// .smartAlbumUserLibrary,
// .smartAlbumPanoramas,
// .smartAlbumLivePhotos,
// .smartAlbumBursts,
// .smartAlbumDepthEffect,
// .smartAlbumScreenshots,
]
最后,
smartAlbumsArray = fetchSmartCollections(with: .smartAlbum, subtypes: subtypes)
而不是以下的某些变体:
smartAlbums = PHAssetCollection.fetchAssetCollections(with: .smartAlbum, subtype: .albumRegular, options: smartAlbumOptions)