gpt4 book ai didi

ios - 快速获取至少包含一种媒体的 smartAlbum

转载 作者:行者123 更新时间:2023-11-30 12:06:04 24 4
gpt4 key购买 nike

我正在获取用户库中存在的所有 smartAlbum。我使用的代码是这样的:

 var smartAlbums: PHFetchResult<PHAssetCollection>!

override func viewDidLoad() {
super.viewDidLoad()
let options = PHFetchOptions()
options.predicate = NSPredicate(format: "estimatedAssetCount > 0")
options.sortDescriptors = [NSSortDescriptor(key: "localizedTitle", ascending: true)]
smartAlbums = PHAssetCollection.fetchAssetCollections(with: .smartAlbum, subtype: .albumRegular, options: options)

i 将在表格 View 中显示结果,我用它来计算部分中的行数:

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
switch Section(rawValue: section)! {
case .allPhotos: return 1
case .smartAlbums: return smartAlbums.count
case .userCollections: return userCollections.count
}
}

一切正常...但 smartAlbums 的获取结果也获取零媒体的专辑。基本上它会获取所有专辑。似乎谓词尚未被考虑在内。 相同的谓词应用于 userCollections 并且工作正常。

 userCollections = PHAssetCollection.fetchAssetCollections(with: .album, subtype: .albumRegular, options: options) // this works fine

有没有办法只获取至少包含一种媒体的 smartAlbums?

谢谢!

最佳答案

这就是我解决这个问题的方法:

我创建了一个扩展:

extension PHAssetCollection {
var photosCount: Int {
let fetchOptions = PHFetchOptions()
fetchOptions.predicate = NSPredicate(format: "mediaType == %d OR mediaType == %d", PHAssetMediaType.image.rawValue, PHAssetMediaType.video.rawValue)
let result = PHAsset.fetchAssets(in: self, options: fetchOptions)
return result.count
}

}

然后在我获取对象的 TableView Controller 中,我创建了一个子类型数组(这不是获取所有 smartAlbums,而是仅获取我需要的),并且我初始化了一个 PHCollection 类型的数组:

  let subtypes:[PHAssetCollectionSubtype] = [
.smartAlbumFavorites,
.smartAlbumPanoramas,
.smartAlbumScreenshots,
.smartAlbumSelfPortraits,
.smartAlbumVideos,
.smartAlbumRecentlyAdded,
.smartAlbumSelfPortraits
]
var smartAlbums: [PHAssetCollection] = []

然后,我创建了一个函数来获取与子类型关联的所有 smartAlbums 以及其中至少有一个媒体(图像或视频 -> 这是使用之前创建的扩展执行的):

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, collection.photosCount > 0 { // .photosCount comes from extesion
collections.append(collection)
}
}

在 vieDidLoad 中我获取对象:

override func viewDidLoad() {
super.viewDidLoad()
smartAlbums = fetchSmartCollections(with: .smartAlbum, subtypes: subtypes)
}

我对 swift 不太熟悉,所以我不知道这是否是最好的解决方案,但它有效,并且看到我在网上没有找到任何可以帮助我的东西,我想分享一下是否有人需要这个.

关于ios - 快速获取至少包含一种媒体的 smartAlbum,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46665528/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com