背景
近期在做一些圖片及視頻處理方面的工作,順便把遇到的關(guān)于photokit 的一些坑及需要注意的地方記錄下來,如能給道友一針定是極好的.此文篇幅較小非教學內(nèi)容,如有相關(guān)需求有大量資源.
1. localIdentifier
1.1 Photos 框架中的基類 PHObject 只有一個公開接口 localIdentifier,是對象唯一唯一標志符.
PHObject 實現(xiàn)了 -isEqual 和 -hash 方法.可以直接使用這個屬性進行對比是否同一個對象.
2. PHImageManager
2.1 PHImageManager 在框架中是個單例對象,它提供了加載圖片和視頻的方法.
默認情況下听怕,這些API是異步執(zhí)行.在播放視頻時需要注意回主線程后再進行播放.
2.2 resizeMode 默認是 None,這也造成了返回圖像尺寸與要求尺寸不符.
要返回一個指定尺寸的圖像需要避免兩層陷阱:一定要指定 options 參數(shù),resizeMode 不能為 None.
synchronous: 指定請求是否同步執(zhí)行.
resizeMode: 對請求的圖像怎樣縮放. 有三種選擇:
None: 不縮放;
Fast: 盡快地提供接近或稍微大于要求的尺寸;
Exact: 精準提供要求的尺寸;
deliveryMode: 圖像質(zhì)量. 有三種值:
Opportunistic: 在速度與質(zhì)量中均衡;
HighQualityFormat: 不管花費多長時間,提供高質(zhì)量圖像;
FastFormat: 以最快速度提供好的質(zhì)量(在 synchronous 為 true 時有效).
2.3 synchronous 為 NO 狀態(tài)下 resultHandler 會被多次調(diào)用,
即先返回較低質(zhì)量,再返回較高質(zhì)量, YES 狀態(tài)則直接返回要求圖片.
2.4 通過 requestAVAssetForVideo: options: resultHandler: 方法獲取視頻資源或信息,
返回的 AVAsset 對象不一定都為 AVURLAsset,有可能為其他類型(例: AVComposition 等).
3. iCloud
3.1 PHImageResultIsInCloudKey: 圖像是否必須從 iCloud 請求,這個有巨坑.
獲取圖像時可通過此 key 對其'位置'進行區(qū)分,即原圖是否在本地.
而獲取視頻時,當 networkAccessAllowed = NO 時(YES 暫未親測),是不能使用這個 key 判斷的.
雖然蘋果在9.0以上為 PHAsset 這個類增加了 sourceType 這個屬性,我們能獲取資源來源,
但是,依舊不是也不能通過這個屬性獲取到視頻是否在本地,本人暫時通過 urlAsset.URL 進行判斷.但是!但是!視頻可以正常播放不代表本地視頻是完整的.
同時9.0也新增了 PHAssetResourceManager 這個類用來獲取媒體資源,有興趣可以進行了解.
4. PHPhotoLibrary
4.1 在photoLibraryDidChange(changeInfo: PHChange!)的實現(xiàn)里將所有處理放在主線程里處理;
4.2 所有 PHPhotoLibrary 的觀察者都會收到通知,不管觀察者本身引用的內(nèi)容是否發(fā)生變化,因此要根據(jù)觀察者的情況來對通知進行過濾.
從參數(shù) PHChange 對象里能獲得所有的變化,通過 changeDetailsForObject: 和 changeDetailsForFetchResult: 來獲取細節(jié).
changeDetailsForObject: 獲取的細節(jié)只是 PHObject 子類對象本身的信息變化,包括是否有成員被刪除以及是否有圖像或視頻發(fā)生變化兩種信息,有用信息實在有限,要處理成員變化需要依靠后者;
對一個 PHFetchResult 對象使用 changeDetailsForFetchResult: 獲取的細節(jié)中只包含該 PHFetchResult 對象變化的信息,可以利用這點來對通知進行過濾處理。
4.3 通過 changeDetailsForFetchResult: 獲取的 PHFetchResultChangeDetails 對象,包含了 FetchResult 的結(jié)果的所有變化情況以及 FetchResult 的成員變化前后的數(shù)據(jù),需要注意的是成員變化的通知坏逢。
IMG_0097.JPG
就到這里吧,如有疑問或建議歡迎道友們補充交流.如需要源碼請評論...