创建相册的过滤 PHAssetCollection 失败

Posted

技术标签:

【中文标题】创建相册的过滤 PHAssetCollection 失败【英文标题】:Creating a filtered PHAssetCollection of Albums fails 【发布时间】:2017-10-26 17:11:08 【问题描述】:

我需要创建一个经过筛选的 smartAlbums 集合,以便在 UITable 中显示。 我之前尝试过各种方法将未过滤的集合转换为可变表单并删除我希望排除的集合,然后重新转换回 PHFetchResult。所有这些尝试都失败了。

我现在正在尝试使用 PHFetch 选项来过滤带有“localizedTitle”键的专辑,这是特别允许的 (https://developer.apple.com/documentation/photos/phfetchoptions)。但是,当我尝试以下尝试排除“视频”智能文件夹的测试用例代码时,我在 newAlbums 中得到零计数结果。当我将谓词设置为 %K == %@ 时,我也得到零结果。正确答案应该是前者的 15 和后者的 1。为什么我的谓词无法选择正确的结果?我不希望将新集合保存回库中,只是将其用于临时显示,所以我没有尝试请求调用(可能我误解了这里的框架?)

我搜索了 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)

【问题讨论】:

有没有人使用瞬态集合来实现这种结果?鉴于瞬态集合(如常规结果集合)是不可变的,因此我不知道如何构建我想要的集合。 【参考方案1】:

这是我发现的一种方法,我已经验证过它可以工作。非常感谢迈克尔https://***.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)

【讨论】:

以上是关于创建相册的过滤 PHAssetCollection 失败的主要内容,如果未能解决你的问题,请参考以下文章

如何从 PHAssetCollection 中删除图像?

何时使用 PHAsset、PHCollection、PHAssetCollection 和 PHCollectionList

swift 将图片保存到自定义相册中

iOS中获取系统相册中的图片

iOS PhotoKit:获取除全景图以外的所有智能相册

删除 PHAssetCollection (Swift)