什么是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)。可以通过这个对象来:
- 获取或者验证用户对当前App访问照片内容的权限
- 对asset和媒体资源集合进行管理,比如:编辑asset元数据或内容,插入新的asset或者重新排列集合的成员
- 注册某个类作为当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存储
一般涉及到图片上传的项目中,图片的上传其实分三步:
- 通过PhotoKit向系统获取图片资源
- 将获取到的图片资源保存到本地沙盒
- 将本地沙盒对应Assets的URL提供给相关网络SDK组件,由SDK统一上传
Assets的存储方式主要有以下几种:
- 利用PHAssetResourceManager进行存储
- 利用Data进行存储
- 利用FileManager进行存储