使用PHAssetCollection.fetchAssetCollectionsWithType()

时间:2015-11-12 20:55:31

标签: swift filter fetch predicate photos

当我发布照片时,请执行以下操作:

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

我得到了几张专辑的结果,所以我可以遍历数组并将他们的标题放在tableView中。

但是:当我使用谓词来过滤并获得例如专辑“Camera Roll”时,结果总是一个空数组:(而且我知道100%确定相机卷存在,因为它使用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可选值”('cos获取结果为空)。为什么一旦包含获取选项???

,搜索返回nil

4 个答案:

答案 0 :(得分:5)

如果你想要相机胶卷专辑,你可能最好象征性地要求它:

SmartAlbumUserLibrary

manager_id子类型是您获取相机胶卷的方式(并不总是称之为)。

答案 1 :(得分:1)

解决方案似乎是使用:

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

所以,传入参数'标识符'我们希望获取的专辑标题的字符串数组实现的结果与尝试不再有效的谓词方法相同。

答案 2 :(得分:0)

如果您只想要Camera Roll 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创建为我创建的模型,您可以更改它并使用您自己的数据模型。

答案 3 :(得分:-1)

尝试格式:

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

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