PHFetchOptions() Фотографии только с использованием PHAsset и PHAssetCollection

Здесь я использую фрагмент из примера кода Apple:

override func awakeFromNib() {
    // Create a PHFetchResult object for each section in the table view.
    let allPhotosOptions = PHFetchOptions()
    allPhotosOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]

    let allPhotos = PHAsset.fetchAssetsWithOptions(allPhotosOptions)
    let smartAlbums = PHAssetCollection.fetchAssetCollectionsWithType(.SmartAlbum, subtype: .AlbumRegular, options: nil)

    let topLevelUserCollections = PHCollectionList.fetchTopLevelUserCollectionsWithOptions(nil)

    // Store the PHFetchResult objects and localized titles for each section.
    self.sectionFetchResults = [allPhotos, smartAlbums, topLevelUserCollections]
    self.sectionLocalizedTitles = ["", NSLocalizedString("Smart Albums", comment: ""), NSLocalizedString("Albums", comment: "")]

    PHPhotoLibrary.sharedPhotoLibrary().registerChangeObserver(self)
}

Это перечисляет все альбомы успешно.

Что мне нужно:

Я хочу отображать только альбомы с фотографиями, исключая видео. Кроме того, исключите видео из списка альбомов, например, в разделе "Все фотографии".

Что я пробовал:

let fetchOptions = PHFetchOptions()
fetchOptions.predicate = NSPredicate(format: "mediaType = %d", PHAssetMediaType.Image.rawValue)

Это приводит к сбою с сообщением «Неподдерживаемый предикат в параметрах выборки: mediaType == 1».


person Gizmodo    schedule 02.09.2016    source источник
comment
В этом вопросе упоминается, что коллекции активов не имеют mediaType (имеет смысл, они могут содержать несколько типов): stackoverflow.com/q/35590640 Вы не показываете, как вы применяете предикат, но я думаю, вам придется фильтровать коллекции каким-то другим способом.   -  person Rhythmic Fistman    schedule 05.09.2016
comment
@RhythmicFistman Пока я считаю, что я должен проверять и фильтровать cellForItemAtIndexPath.   -  person Gizmodo    schedule 05.09.2016
comment
не слишком ли поздно? Разве вы еще не сообщили представлению коллекции о нежелательных не-изображениях в numberOfItemsInSection на тот момент? Я думаю, что вы должны фильтровать до этого.   -  person Rhythmic Fistman    schedule 06.09.2016
comment
Это правда! Так что не получится..   -  person Gizmodo    schedule 06.09.2016


Ответы (2)


Я знаю, что это очень поздний ответ, но если кто-то вроде меня попадет сюда, вам следует использовать этот метод для получения типа носителя. В этом случае PHAssetMediaType.image

func fetchAssets(with mediaType: PHAssetMediaType, options: PHFetchOptions?) -> PHFetchResult<PHAsset>

Итак, в Swift 5 он пишет как

let allPhotosOptions = PHFetchOptions()
allPhotosOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
fetchResult = PHAsset.fetchAssets(with: .image, options: allPhotosOptions)
person dequin    schedule 21.01.2020
comment
Извините, но это извлекает фотографии только из всех альбомов, а не из определенного. - person Eric Yuan; 01.08.2021

Пока у меня работает нормально:

let allAlbums = PHAssetCollection.fetchAssetCollections(with: .album, subtype: .albumRegular, options: nil)
let someAlbum = allAlbums.object(at: 0)
let onlyPhotoOption = PHFetchOptions()
onlyPhotoOption.predicate = NSPredicate(format: "mediaType == %i", PHAssetMediaType.image.rawValue)
let photos = PHAsset.fetchAssets(in: someAlbum, options: onlyPhotoOption)
person Eric Yuan    schedule 01.08.2021