创建过滤的PHAssetCollection相册失败

时间:2017-10-26 17:11:08

标签: ios swift4 photosframework

我需要创建一个过滤的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)

1 个答案:

答案 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)