Photos Framework in iOS

Model Object

所有的model object都继承自抽象基类PHObject,其子类包括
PHAsset:代表一个单独的资源,比如图片或者视频。可以是本地也可以是远程(iCloud)的,它仅仅只包含一些元数据,比如media type等。

PHCollection:抽象类,有两个子类:

PHAssetCollection、PHCollectionList。代表着asset的集合以及含有多个asset集合的集合。
PHObjectPlaceholder:创建了新的object但是还没添加到相册中时需要用到它,用来fetch新建的object。

所有得到的的PHObject都是不可变得(immutable),所以在要修改的时候必须创建一个change request。
在fetch和load操作时其他几个常用的类:

  • PHFetchResult
  • PHImageManager
  • PHFetchOptions
  • PHImageRequestOptions & PHVideoRequestOptions:在加载时可能需要用到。用来指定一些附加选项,比如照片质量、是否需要联网等。

Fetch Object

可以使用上面说到的三个类对应的类方法来获取(fetch)对应的object,在获取的时候可以指定不同的PHFetchOptions,通过设置PHFetchOptions的predicate, sortDescriptors, includeAllBurstAssets, includeHiddenAssets和wantsIncrementalChangeDetails属性来指定获取什么样的object。通常调用这些类方法会返回PHFetchResult,它有类似NSArray的接口,是一个有序的model object表。值得高兴的是PHFetchResult会替你进行内存管理以及对object的lazy loading。但是这些Model Object都不包含相应的内容(content),如果需要得到相应的内容,必须去获取以及加载它,下面会讲到如何去加载。

Load Content

当要展示某个asset里面的某幅图片或者某个视频的内容时,可以使用PHImageManager,它以异步的方式工作,可以进行加载、缓存、自适应等。它的子类PHCachingImageManager可以预缓存asset的内容到内存当中以保证你在要用到这些图片时,它是已经加载好了的。

一般使用PhotoKit的几个步骤是:Fetch—>load/cache—>edit/modify content

ChangeRequest and Editting

对图片或者相册修改时可能需要用到下面一些类:

  • PHPhotoLibrary:全局共享的,代表着用户的整个相册。所有change request以及change notification注册发生的地方,所有的change是被异步处理的,发生在photo library change block当中。
  • PHAssetChangeRequest:用来创键、编辑、删除asset,编辑的时候可以修改相关属性,比如拍摄位置、是否收藏、是否隐藏等。
  • PHAssetCollectionChangeRequest & PHCollectionListChangeRequest:创建、编辑、删除collection,亦即创键或删除文件夹,以及在它们之间进行asset的移动。
  • PHContentEditingInput:当想要编辑某个asset的内容的时候,需要用到它,它提供了原始内容和adjustment data。
  • PHContentEditingOutput:描述编辑后的结果,必须提供adjustment data到输出的内容当中。如果要提交编辑之后的内容,必须在change block中将已编辑了的输出内容赋给change request。
  • PHAdjustmentData:包含了应用程序定义的对某个asset最近修改的内容清单,包含了标识符合版本号,如果app能够识别这个标识符,则用户可以取消或修改这次的编辑。

Changes Observing

下面几个类在响应相册变化时可能会用到:

  • PHChange:如果注册了观察相册变化的通知,将会在变化发生时获得该类的一个实例,进而调用其实例方法来获取变化的详情。
  • PHObjectChangeDetails:这个类提供了变化前后的object。
  • PHFetchResultChangeDetails:这个类提供了fetch result变化的详情,变化发生前后的fetch result都能通过这个类拿到。
  • PhotoKit是iOS8提出的一个新的框架,用它你可以创建一个类似系统自带的Photo App,非常灵活,提供了各种接口来获取图片、视频,以及性能得到进一步提高。由于fetch和load操作得到的结果(PHFetchResult)是不可变的所以可以在线程安全的,甚至在不同扩展间都是安全的。除此之外,PHImageManager和PHFetchResult将网络请求和内存管理抽象化,不需要人为操作,即在请求以及遍历的时候无论是在iCloud还是本地磁盘,都能快速得到想要的结果。当object的信息发生改变时,相应的API被触发,通过调用这些API即可得到改变后的object来替代当前的object,我们需要做的仅仅是在这些改变发生后去重新请求。change request必须发生在photo library change block中,这个基于block的API允许系统处理用户权限以及保持相册的完整性。同时adjustment data 为不同的应用以及扩展开启了恢复或修改对方编辑(editting)的可能性。

每种资源都被抽像成 PHAsset,

属性:

1
pixelWidth, pixelHeight, creationDate, modificationDate and favorite.
1
2
3
4
5
6
7
8
var assets = PHAsset.fetchAssetsWithMediaType(.Image, options: nil)
enum PHAssetMediaType : Int {
case Unknown
case Image
case Video
case Audio
}
1
2
3
4
5
self.imageManager?.requestImageForAsset(videoAsset, targetSize: CGSize(width: 150, height: 150),
contentMode: .AspectFill, options: nil) {
image, info in
self.thumbnailImageView.image = image
}

REF::