【问题标题】:Fetch only PHAssetCollections containing at least one photo仅获取包含至少一张照片的 PHAssetCollections
【发布时间】:2017-06-28 11:06:35
【问题描述】:

在 iOS PhotoKit 中,我可以像这样获取所有非空相册:

let fetchOptions = PHFetchOptions()
fetchOptions.predicate = NSPredicate(format: "estimatedAssetCount > 0")
let albumFetchResult = PHAssetCollection.fetchAssetCollections(with: .album, subtype: .any, options: albumFetchOptions)

albumFetchResult.enumerateObjects({ (collection, _, _) in
    // Do something with the album...
})

然后我只能从相册中获取这样的照片:

let fetchOptions = PHFetchOptions()
fetchOptions.predicate = NSPredicate(format: "mediaType = %d", PHAssetResourceType.photo.rawValue)
let fetchResults = PHAsset.fetchAssets(in: collection, options: fetchOptions)

但是第一部分可以给我只有视频的专辑,这意味着在我将谓词应用于第二部分后,专辑将是空的。在我开始使用它们之前,有没有办法在第一部分中过滤掉这些专辑?

【问题讨论】:

    标签: ios swift photokit


    【解决方案1】:

    如果不获取集合中的项目,似乎无法像这样过滤集合。有关可用的获取选项,请参阅the docs; none 允许按特定类型媒体的数量进行过滤。

    我实现这一点的方法是获取用户创建的所有相册,然后使用仅返回图像的谓词从相册中获取资产。

    所以把它放在代码中:

    var userCollections: PHFetchResult<PHAssetCollection>!
    // Fetching all PHAssetCollections with at least some media in it
    let options = PHFetchOptions()
        options.predicate = NSPredicate(format: "estimatedAssetCount > 0")
    // Performing the fetch
    userCollections = PHAssetCollection.fetchAssetCollections(with: .album, subtype: .albumRegular, options: options)
    

    接下来,通过指定谓词从图像集合中获取资产:

    // Getting the specific collection (I assumed to use a tableView)
    let collection = userCollections[indexPath.row]
    let optionsToFilterImage = PHFetchOptions()
        optionsToFilterImage.predicate = NSPredicate(format: "mediaType = %d", PHAssetMediaType.Image.rawValue)
    // Fetching the asset with the predicate to filter just images
    let justImages = PHAsset.fetchAssets(in: collection, options: optionsToFilterImage)
    

    最后,统计图片的数量:

    if justImages.count > 0 {
        // Display it
    } else {
        // The album has no images
    }
    

    【讨论】:

    • 它只给你视频作为结果? albumFetchResult 常量是用户创建的所有专辑的集合...要获取您需要使用 PHImageManager 的单个图像...如果您再解释一下您要实现的目标,我会尽力帮助您
    • 为了测试这一点,我创建了一个仅包含视频的相册。我想要实现的是让albumFetchResult 从其获取结果中排除这样的相册——即只应该包含至少有一张照片的相册。在获取相册时使用 .albumRegular 作为子类型无法实现。
    • 但是它可以工作......基本上你使用带有谓词的 fetchresult 然后只控制结果......如果它 > 大于零,你会显示它,否则你不会......跨度>
    • 哦。当然,我可以获取每个 PHAssetCollection 并获取它们的所有项目并计算它们。但我的问题特别涉及在获取所有项目之前过滤掉没有照片的相册,因此我可以利用 Apple 优化的查询机制来提供更好的用户体验。获取所有内容的成本很高,并且会让用户等待加载内容。
    • @PhlippieBosman 对此表示怀疑。确实没有其他选项可以过滤相册。这是一个耻辱,因为它是一个非常合理的用例(视频应用程序应该只显示带有视频的专辑)。用 15k 资产过滤我的照片库,200 个相册需要 5 秒。这需要在照片库更新时重复。用户可能拥有数十万资产,这会让他们坐在那里一分钟。有趣的是,在 WWDC 视频中,Apple 警告说照片应用程序应该是高效的,并且在获取项目时不要让用户等待。怎么样?回到 UIImagePickerController?
    猜你喜欢
    • 1970-01-01
    • 2021-07-05
    • 1970-01-01
    • 2015-03-20
    • 1970-01-01
    • 2019-12-09
    • 2020-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多