2015-11-12 5 views
2

, когда я запускаю фото принести как:Получить фотографии с определенного альбома в стриже, используя PHAssetCollection.fetchAssetCollectionsWithType()

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

я получаю результат нескольких альбомов, так что я могу перебирать массив и поместить их название в таблицеView.

НО: Когда я использую предикат для фильтрации и получаю, например, альбом «Camera Roll», результатом всегда является пустой массив: (И я знаю, что 100% уверены, что Camera Roll существует, потому что с параметрами nil он извлекает его)

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 

Я прочитал 4 или 5 различных методов от людей в Интернете, и все они имеют этот предикат ли с "TITLE =% @", или "localizedTitle =% @" или "localizedIdentifier =% @" ... Я НЕ ПОЛУЧУ ЭТО. Кажется, работа для людей, а не для меня. Компилятор сбой на последней строке, пытаясь «развернуть необязательное значение nil» («если результат выборки пуст»). Почему поиск возвращает нуль, как только включаются опции выборки ???

ответ

1

решение, как представляется, использовать:

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

Итак, переходя в «идентификатор» параметра массив строк с названиями альбомов, которые мы хотим принести к тому же результату, чем попытка предикат метод, который больше не работает.

+0

Хотя этот код может ответить на вопрос, было бы лучше объяснить, как он решает проблему, не вводя других и почему ее использовать. Ответы только на код не полезны в долгосрочной перспективе. – JAL

0

Попробуйте формат:

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

или

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

4

Если вы хотите Фотопленка альбом, вы, вероятно, лучше просить это символически:

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

Подтип- это то, как вы получаете Camera Roll (который не всегда называется так).

0

Если вы хотите Фотопленка ablbum только, вы можете попробовать что-то вроде этого:

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 

    } 

Обратите внимание, что вы должны AlbumModel является модель, которую я создал, вы можете изменить его и использовать свою собственную модель данных.