2015-11-12 2 views
2

lorsque je lance quelques photos vont chercher comme:Obtenez des photos de l'album spécifique à l'aide rapide PHAssetCollection.fetchAssetCollectionsWithType()

let assetCollections: PHFetchResult = PHAssetCollection.fetchAssetCollectionsWithType(.SmartAlbum, subtype: .Any, options: nil) 

je reçois un résultat de plusieurs albums, donc je peux parcourir le tableau et de mettre leurs titres dans un tableauView. MAIS: quand j'utilise un prédicat pour filtrer et obtenir par exemple l'album "Camera Roll", le résultat est toujours un tableau vide: (Et je sais 100% sûr que Camera Roll existe car avec des options nulles il le récupère)

let fetchOptions = PHFetchOptions() 
fetchOptions.predicate = NSPredicate(format: "title = %@", "Camera Roll") 
let assetCollections: PHFetchResult = PHAssetCollection.fetchAssetCollectionsWithType(.SmartAlbum, subtype: .Any, options: fetchOptions) 
let album: PHAssetCollection = assetCollections.firstObject as! PHAssetCollection 

J'ai lu 4 ou 5 méthodes différentes par des personnes en ligne, et ils ont tous ce prédicat que ce soit avec "title =% @" ou "localizedTitle =% @" ou "localizedIdentifier =% @" ... Je ne l'obtiens pas. Semble travailler pour les gens, pas pour moi. Le compilateur plante à la dernière ligne en essayant de "déballer une valeur optionnelle nulle" ('cos le résultat de l'extraction est vide). Pourquoi la recherche revient-elle à zéro dès l'inclusion des options de recherche ???

Répondre

1

la solution semble être à utiliser:

PHAssetCollection.fetchAssetCollectionsWithLocalizedIdentifiesr(identifiers: [String], options: PHFetchOptions) 

Ainsi, en passant dans le paramètre « identifiant » un tableau de chaînes avec les titres des albums que nous voulons chercher réalise le même résultat que d'essayer le prédicat méthode qui ne semble plus fonctionner.

+0

Bien que ce code puisse répondre à la question, il vaudrait mieux expliquer comment il résout le problème sans en présenter d'autres et pourquoi l'utiliser. Les réponses au code uniquement ne sont pas utiles à long terme. – JAL

0

Essayez le format:

fetchOptions.predicate = NSPredicate(format: "%K == %@", "title", "Camera Roll")

ou

fetchOptions.predicate = NSPredicate(format: "%K LIKE[cd] %@", "title", "Camera Roll")

4

Si vous voulez l'album Camera Roll, vous êtes probablement mieux demander symboliquement:

let collections = PHAssetCollection.fetchAssetCollectionsWithType(.SmartAlbum, subtype: .SmartAlbumUserLibrary, options: nil) 

Le SmartAlbumUserLibrary sous-type est comment vous obtenez le roulement de la caméra (qui n'est pas toujours appelé comme ça).

0

Si vous voulez que l'appareil photo rouleau ablbum, vous pouvez essayer quelque chose comme ceci:

func getCameraRoll() -> AlbumModel { 
     var cameraRollAlbum : AlbumModel! 

     let cameraRoll = PHAssetCollection.fetchAssetCollections(with: .smartAlbum, subtype: .smartAlbumUserLibrary, options: nil) 

     cameraRoll.enumerateObjects({ (object: AnyObject!, count: Int, stop: UnsafeMutablePointer) in 
     if object is PHAssetCollection { 
      let obj:PHAssetCollection = object as! PHAssetCollection 

      let fetchOptions = PHFetchOptions() 
      fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)] 
      fetchOptions.predicate = NSPredicate(format: "mediaType = %d", PHAssetMediaType.image.rawValue) 
      let assets = PHAsset.fetchAssets(in: obj, options: fetchOptions) 

      if assets.count > 0 { 
      let newAlbum = AlbumModel(name: obj.localizedTitle!, count: assets.count, collection:obj, assets: assets) 

      cameraRollAlbum = newAlbum 
      } 
     } 
     }) 
    return cameraRollAlbum 

    } 

Notez que vous devez AlbumModel est un modèle que je créé, vous pouvez le modifier et utiliser votre propre modèle de données.