PhotoKit 照片库的管理-获取类型相册

PhotoKit对象模型

所有PhotoKit对象都继承PHObject抽象类,公共接口只提供localIdentifier属性。

PHAsset:表示照片库里单独资源以提供资源元数据。

PHAssetCollection:表示资源集合,是PHCollection的子类。单独的资源集合可以是照片库里的相册或智能相册,包括所有的视频集合,最近添加项目,用户收藏,所有连拍照片等。

PHCollectionList:表示一组的 PHCollections。因为它本身就是 PHCollection,所以集合列表可以包含其他集合列表,它们允许复杂的集合继承。实际上,我们可以在照片应用的时刻栏目中看到它:照片 --- 时刻 --- 精选 --- 年度,就是一个例子。

照片库中有两种资源可供获取:PHAssetPHCollection,前者代表图像或视频对象,后者是前者的集合或自身类型的集合。PHCollection是个基类,有PHAssetCollectionPHCollectionList两个子类,分别代表 Photos 里的相册和文件夹。

Fetch照片实体

Fetch方法命名类似class func fetchXXX(..., options: PHFetchOptions) -> PHFetchResult。这里的options参数提供了对结果进行过滤和排序的途径,和NSFetchRequest的predicate与sortDescriptors类似。

获取结果为返回的PHFetchResult对象,能够缓存最近请求内容,这个返回不会自动更新。就算请求的照片库内容发生了改变,获取方法所返回的 PHFetchResult 对象也是不会自动更新。如果要更新实时显示最新结果需要通过PHPhotoLibrary对象用registerChangeObserver(...)方法注册一个遵从PHPhotoLibraryChangeObserver协议的Observer。如果照片库里有变化了,photoLibraryDidChange(...)方法会被调用,这个方法只有一个PHChange类型参数。

PHChange提供了changeDetailsForObject(…)和changDetailsForFetchResult(...)方法能够通过传入需要观察跟踪的PHObject或PHFetchResult对象来跟踪变化。观察变化用PHObjectChangeDetails观察是否变化是否曾被删除或PHFetchResultChangeDetails适合简化CollectionView或TableView更新操作。

临时集合 (Transient Collections)

你可能会发现你已经设计了一个可以操作资源集合的组件,并且你还希望它能够处理任意一组的资源。PhotoKit 通过临时资源集合,让我们可以轻松做到这点。

你可以通过 PHAsset 对象数组或是包含资源的 PHFetchResult 对象来创建临时资源集合。创建的操作在 PHAssetCollection 的transientAssetCollectionWithAssets(...) 和 transientAssetCollectionWithFetchResult(...) 工厂方法内完成。这些方法创建出来的对象可以像其它的 PHAssetCollection 对象一样使用。尽管如此,这些集合不会被存储到用户照片库,自然也不会在照片应用中展示出来。

和资源集合相似,你可以用 PHCollectionList 中的 transientCollectionListWithXXX(...) 工厂方法来创建临时集合列表。

当你要合并两个获取请求时,你就会发现这个东西非常有用。

获取指定类型相册

PHFetchResult *smartAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAny options:nil];

这个方法需要至少指定两个参数:

enum PHAssetCollectionType : Int {
    case Album //从 iTunes 同步来的相册,以及用户在 Photos 中自己建立的相册
    case SmartAlbum //经由相机得来的相册
    case Moment //Photos 为我们自动生成的时间分组的相册
}

enum PHAssetCollectionSubtype : Int {
    case AlbumRegular //用户在 Photos 中创建的相册,也就是我所谓的逻辑相册
    case AlbumSyncedEvent //使用 iTunes 从 Photos 照片库或者 iPhoto 照片库同步过来的事件。然而,在iTunes 12 以及iOS 9.0 beta4上,选用该类型没法获取同步的事件相册,而必须使用AlbumSyncedAlbum。
    case AlbumSyncedFaces //使用 iTunes 从 Photos 照片库或者 iPhoto 照片库同步的人物相册。
    case AlbumSyncedAlbum //做了 AlbumSyncedEvent 应该做的事
    case AlbumImported //从相机或是外部存储导入的相册,完全没有这方面的使用经验,没法验证。
    case AlbumMyPhotoStream //用户的 iCloud 照片流
    case AlbumCloudShared //用户使用 iCloud 共享的相册
    case SmartAlbumGeneric //文档解释为非特殊类型的相册,主要包括从 iPhoto 同步过来的相册。由于本人的 iPhoto 已被 Photos 替代,无法验证。不过,在我的 iPad mini 上是无法获取的,而下面类型的相册,尽管没有包含照片或视频,但能够获取到。
    case SmartAlbumPanoramas //相机拍摄的全景照片
    case SmartAlbumVideos //相机拍摄的视频
    case SmartAlbumFavorites //收藏文件夹
    case SmartAlbumTimelapses //延时视频文件夹,同时也会出现在视频文件夹中
    case SmartAlbumAllHidden //包含隐藏照片或视频的文件夹
    case SmartAlbumRecentlyAdded //相机近期拍摄的照片或视频
    case SmartAlbumBursts //连拍模式拍摄的照片,在 iPad mini 上按住快门不放就可以了,但是照片依然没有存放在这个文件夹下,而是在相机相册里。
    case SmartAlbumSlomoVideos //Slomo 是 slow motion 的缩写,高速摄影慢动作解析,在该模式下,iOS 设备以120帧拍摄。不过我的 iPad mini 不支持,没法验证。
    case SmartAlbumUserLibrary //这个命名最神奇了,就是相机相册,所有相机拍摄的照片或视频都会出现在该相册中,而且使用其他应用保存的照片也会出现在这里。
    case Any //包含所有类型
}


posted @ 2017-04-12 15:15  锦夏ing  阅读(443)  评论(0编辑  收藏  举报