2017-10-10 4 views
0

Je récupère tout le smartAlbum présent dans la bibliothèque utilisateur. Le code J'utilise est le suivant:Swift Récupération de smartAlbum avec au moins un média

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) 

L'i affiche le résultat dans une tableview et je l'utiliser pour compter le nombre de lignes dans la section:

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 
    } 
} 

Tout fonctionne très bien .. mais le résultat de recherche pour smartAlbums récupère aussi un album avec zéro média. Fondamentalement, il récupère tous les albums. Il semble que le prédicat n'a pas été pris en considération. le même prédicat est appliqué à userCollections et fonctionne correctement.

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

Existe-t-il un moyen de récupérer uniquement les smartAlbums avec au moins un média?

Merci!

Répondre

0

Voilà comment je l'ai résolu:

J'ai créé une extension:

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 
} 

}

Puis, dans mon contrôleur tableview où je suis aller chercher les objets que je » J'ai créé un tableau de sous-types (pour récupérer tous les smartAlbums mais seulement celui dont j'avais besoin) et j'ai initialisé un tableau de type PHCollection an:

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

J'ai ensuite créé une fonction pour obtenir tous les smartAlbums associés au sous-type et avec au moins un média en elle (image ou vidéo -> ceci est exécuté avec l'extension créée précédemment):

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) 
     } 
    } 

et vieDidLoad i aille chercher les objets:

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

Je suis un peu nouveau pour rapidement je ne peux pas dire si cela est la meilleure solution, mais il fonctionne, et vu que je ne l'ai pas trouvé quoi que ce soit sur le net qui pourrait aider moi, je pensais partager si quelqu'un avait besoin de ça.