2017-06-28 7 views
2

In iOS PhotoKit enthält, kann ich alle nicht leeren Alben wie diese holen:Fetch nur PHAssetCollections mindestens ein Foto

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

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

Dann habe ich nur die Fotos aus dem Album wie dieses nicht erhalten

Aber der erste Teil kann mir Alben mit nur Videos geben, was bedeutet, dass, nachdem ich das Prädikat auf den zweiten Teil angewendet habe, das Album leer sein wird. Gibt es eine Möglichkeit, diese Alben im ersten Teil herauszufiltern, bevor ich sie benutze?

Antwort

0

Es scheint, dass Sammlungen nicht so gefiltert werden können, ohne dass die Elemente in den Sammlungen abgerufen werden. Siehe the docs für verfügbare Abrufoptionen; Keines erlaubt Filtern nach der Nummer eines bestimmten Medientyps.

Die Art, wie ich dies erreichen würde, ist durch Abrufen aller Alben, die vom Benutzer erstellt wurden, und Abrufen der Assets aus den Alben mit einem Prädikat, das nur Bilder zurückgibt.

Also, es in Code:

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) 

nächsten die Vermögenswerte aus einer Sammlung holen, die Bilder sind durch ein Prädikat spezifiziert:

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

Schließlich zählt die Anzahl der Bilder:

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

Funktioniert nicht für mich :( –

+0

gibt es nur Videos als Ergebnis? Die albumFetchResult Konstante ist eine Sammlung aller vom Benutzer erstellten Alben ... um das einzelne Bild zu holen, das Sie benötigen, um PHImageManager zu verwenden ... Wenn Sie ein wenig mehr erklären, was Sie erreichen wollen, werde ich versuchen, Ihnen zu helfen – Marco

+0

Um dies zu testen Ich habe ein Album erstellt, das nur Videos enthält. Was ich versuche zu erreichen, ist, dass "albumFetchResult" ein solches Album von seinen Abrufergebnissen ausschließt - d. H. Es sollten nur Alben mit mindestens einem Foto enthalten sein. Die Verwendung von '.albumRegular' als Untertyp beim Abrufen von Alben erreicht dies nicht. –