背景
近期在做一些图片及视频处理方面的工作,顺便把遇到的关于photokit 的一些坑及需要注意的地方记录下来,如能给道友一针定是极好的.此文篇幅较小非教学内容,如有相关需求有大量资源.
1. localIdentifier
1.1 Photos 框架中的基类 PHObject 只有一个公开接口 localIdentifier,是对象唯一唯一标志符.
PHObject 实现了 -isEqual 和 -hash 方法.可以直接使用这个属性进行对比是否同一个对象.
2. PHImageManager
2.1 PHImageManager 在框架中是个单例对象,它提供了加载图片和视频的方法.
默认情况下,这些API是异步执行.在播放视频时需要注意回主线程后再进行播放.
2.2 resizeMode 默认是 None,这也造成了返回图像尺寸与要求尺寸不符.
要返回一个指定尺寸的图像需要避免两层陷阱:一定要指定 options 参数,resizeMode 不能为 None.
synchronous: 指定请求是否同步执行.
resizeMode: 对请求的图像怎样缩放. 有三种选择:
None: 不缩放;
Fast: 尽快地提供接近或稍微大于要求的尺寸;
Exact: 精准提供要求的尺寸;
deliveryMode: 图像质量. 有三种值:
Opportunistic: 在速度与质量中均衡;
HighQualityFormat: 不管花费多长时间,提供高质量图像;
FastFormat: 以最快速度提供好的质量(在 synchronous 为 true 时有效).
2.3 synchronous 为 NO 状态下 resultHandler 会被多次调用,
即先返回较低质量,再返回较高质量, YES 状态则直接返回要求图片.
2.4 通过 requestAVAssetForVideo: options: resultHandler: 方法获取视频资源或信息,
返回的 AVAsset 对象不一定都为 AVURLAsset,有可能为其他类型(例: AVComposition 等).
3. iCloud
3.1 PHImageResultIsInCloudKey: 图像是否必须从 iCloud 请求,这个有巨坑.
获取图像时可通过此 key 对其'位置'进行区分,即原图是否在本地.
而获取视频时,当 networkAccessAllowed = NO 时(YES 暂未亲测),是不能使用这个 key 判断的.
虽然苹果在9.0以上为 PHAsset 这个类增加了 sourceType 这个属性,我们能获取资源来源,
但是,依旧不是也不能通过这个属性获取到视频是否在本地,本人暂时通过 urlAsset.URL 进行判断.但是!但是!视频可以正常播放不代表本地视频是完整的.
同时9.0也新增了 PHAssetResourceManager 这个类用来获取媒体资源,有兴趣可以进行了解.
4. PHPhotoLibrary
4.1 在photoLibraryDidChange(changeInfo: PHChange!)的实现里将所有处理放在主线程里处理;
4.2 所有 PHPhotoLibrary 的观察者都会收到通知,不管观察者本身引用的内容是否发生变化,因此要根据观察者的情况来对通知进行过滤.
从参数 PHChange 对象里能获得所有的变化,通过 changeDetailsForObject: 和 changeDetailsForFetchResult: 来获取细节.
changeDetailsForObject: 获取的细节只是 PHObject 子类对象本身的信息变化,包括是否有成员被删除以及是否有图像或视频发生变化两种信息,有用信息实在有限,要处理成员变化需要依靠后者;
对一个 PHFetchResult 对象使用 changeDetailsForFetchResult: 获取的细节中只包含该 PHFetchResult 对象变化的信息,可以利用这点来对通知进行过滤处理。
4.3 通过 changeDetailsForFetchResult: 获取的 PHFetchResultChangeDetails 对象,包含了 FetchResult 的结果的所有变化情况以及 FetchResult 的成员变化前后的数据,需要注意的是成员变化的通知。
就到这里吧,如有疑问或建议欢迎道友们补充交流.如需要源码请评论...