PhotoKit In iOS

2,123 阅读4分钟

什么是PhotoKit

PhotoKit是iOS 8.0后苹果提供给开发者使用管理、访问系统的图片资源和视频资源的框架。使用PhotoKit,开发者可以获取和缓存assets(资源)用来显示和播放,编辑图片和视频的内容,或者管理aseets的集合,比如相册、精彩时刻、或者共享相册。

PhotoKit中重要的类

  • PHAsset: 单个资源,可以是照片/视频/动态图片
  • PHCollection:PHAssetCollection和PHCollectionList的抽象类
  • PHAssetCollection:PHCollection的子类,单个资源的集合,如相册、时刻等
  • PHCollectionList:PHCollection的子类,集合的集合,如相册文件夹
  • PHPhotoLibrary:类似于总管理,负责注册通知、检查和请求获取权限
  • PHImageManager:按照要求获取指定的图片的管理者
  • PHCachingImageManager:PHImageManager的子类
  • PHAssetResourceManager:专门用于Photos资源存储的管理类
  • PHAssetChangeRequest:编辑相册,增删改查
  • PHFetchResult: 一个保存PHAsset或者PHCollection的数组

详细解释

PHCollection

该类有两个类方法:

// 根据指定的PHCollectionList获取PHCollection集合
class func fetchCollections(in: PHCollectionList, options: PHFetchOptions?) -> PHFetchResult<PHCollection>

// 从照片库的用户创建的相册和文件夹的层次结构中检索集合。
class func fetchTopLevelUserCollections(with: PHFetchOptions?) -> PHFetchResult<PHCollection>

PHAssetCollection

一个该实例对象代表一个相册,是PHCollection的子类。它的所有属性都是只读的,另外有8个类方法,用来获取想要的结果。

class func fetchAssetCollections(with type: PHAssetCollectionType, 
								 subtype: PHAssetCollectionSubtype, 
								 options: PHFetchOptions?) -> PHFetchResult<PHAssetCollection>

该方法是该类的主要访问方法,主要用于在未知相册的情况下,直接通过type和subtype从相册获取相应的相册。type和subtype如下所示:

enum PHAssetCollectionType : Int {
    case album					// 相册
    case smartalbum				// 智能相册
    case moment					// 时刻
}

enum PHAssetCollectionSubtype : Int {
    case albumRegular = 2				// 在iPhone中自己创建的相册
    case albumSyncedEvent = 3			// 从iPhone(就是现在的图片app)中导入图片到设备
    ...太多了自己搜文档吧
}

PHPhotoLibrary

一个单例对象,用于管理对用户照片库的访问和更改。PHPhotoLibrary代表了由Photos应用程序管理的整套媒体资源和集合,包括存储在本地设备上的asset和存储在iCould Photos中的assets(如果用户已经开启iCould)。可以通过这个对象来:

  1. 获取或者验证用户对当前App访问照片内容的权限
  2. 对asset和媒体资源集合进行管理,比如:编辑asset元数据或内容,插入新的asset或者重新排列集合的成员
  3. 注册某个类作为当library发生改变时候的接受者

PHFetchResult

从某个获取Aseet的方法返回的有序的asset或者collections的列表(可以理解为一个数组)

PHAsset

该类表示具体的资源信息,如宽度、高度、时长、是否是收藏的等等。同上面提到的几个类一样,该类的属性也都是只读的,所以我们主要是用它的方法来获取资源。

// 用来判断该资源是否可以做某些操作,比如增删改查。也从另一个方面暗示了,
// 在对该资源做一些操作之前有必要先做一下判断,这可以省去一些不必要的麻烦。
func canPerform(PHAssetEditOperation) -> Bool

// 该方法是从相册中获取单个资源的主要途径
class func fetchAssets(in assetCollection: PHAssetCollection, options: PHFetchOptions?) -> PHFetchResult<PHAsset>

PHImageManager

便于检索或生成预览缩略图和asset数据的对象。

PHAssetResourceManager

Assets可以具有多个基础数据资源 - 例如,原始版本和编辑版本 - 每个都由PHAssetResource对象表示。 与PHImageManager类不同,PHImageManager类以缩略图,图像对象或视频对象的形式提供和缓存资产的主要表示,PHAssetResourceManager提供对这些底层数据资源的直接访问。

主要方法

// 获取一个单例对象
class func `default`() -> PHAssetResourceManager

// 异步请求指定资产资源的基础数据
func requestData(for: PHAssetResource, 
				 options: PHAssetResourceRequestOptions?, 
				 dataReceivedHandler: (Data) -> Void, 
				 completionHandler: (Error?) -> Void) -> PHAssetResourceDataRequestID
				 
// 取消异步请求
func cancelDataRequest(PHAssetResourceDataRequestID)

// 请求Asset的基础数据,异步写入本地文件
func writeData(for: PHAssetResource, 
			   toFile: URL, 
			   options: PHAssetResourceRequestOptions?, 
			   completionHandler: (Error?) -> Void)

Assets存储

一般涉及到图片上传的项目中,图片的上传其实分三步:

  1. 通过PhotoKit向系统获取图片资源
  2. 将获取到的图片资源保存到本地沙盒
  3. 将本地沙盒对应Assets的URL提供给相关网络SDK组件,由SDK统一上传

Assets的存储方式主要有以下几种:

  1. 利用PHAssetResourceManager进行存储
  2. 利用Data进行存储
  3. 利用FileManager进行存储