PhotoKit -- 那些年的那些坑

背景

近期在做一些圖片及視頻處理方面的工作,順便把遇到的關于photokit 的一些坑及需要注意的地方記錄下來,如能給道友一針定是極好的.此文篇幅較小非教學內(nèi)容,如有相關需求有大量資源.

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: 圖像質量. 有三種值: 
        Opportunistic: 在速度與質量中均衡; 
        HighQualityFormat: 不管花費多長時間,提供高質量圖像;
        FastFormat: 以最快速度提供好的質量(在 synchronous 為 true 時有效). 
      
2.3 synchronous 為 NO 狀態(tài)下 resultHandler 會被多次調(diào)用,
    即先返回較低質量,再返回較高質量, 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 的結果的所有變化情況以及 FetchResult 的成員變化前后的數(shù)據(jù),需要注意的是成員變化的通知。
IMG_0097.JPG

就到這里吧,如有疑問或建議歡迎道友們補充交流.如需要源碼請評論...

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容