Photo Frameworks之PHAssetCollection筋岛、PHCollectionList和PHAsset

該框架在圖片app中用來管理圖片和音視頻文件淹冰,用來一部查找和緩存資源或者縮略圖叮喳、修復(fù)內(nèi)容和在不同設(shè)備間同步圖片等資源被芳。
先簡單的了解一些概念:

  • PHAsset:單個(gè)資源
  • PHAssetCollection:PHCollection的子類,單個(gè)資源的集合馍悟,如相冊畔濒、時(shí)刻等
  • PHCollectionList:PHCollection的子類,集合的集合锣咒,如相冊文件夾
  • PHPhotoLibrary:類似于總管理侵状,負(fù)責(zé)注冊通知、檢查和請求獲取權(quán)限
  • PHImageManager:按照要求獲取制定的圖片
  • PHCachingImageManager:PHImageManager的子類
  • PHAssetChangeRequest:編輯相冊毅整,增刪改查
下面一一做盡可能詳盡的說明

*PHCollection

在進(jìn)行下面的實(shí)驗(yàn)之前趣兄,先簡單的說說該類中的一個(gè)方法:
+ (PHFetchResult<PHCollection *> *)fetchTopLevelUserCollectionsWithOptions:(nullable PHFetchOptions *)options;
該方法用來獲取處于圖片app中根目錄下的自己創(chuàng)建的相冊(貌似自己創(chuàng)建的本身就在根目錄下)

1、PHAssetCollection

一個(gè)該實(shí)例對象代表一個(gè)相冊毛嫉。是PHCollection的子類诽俯。
它的所有屬性都是只讀的,另外有8個(gè)類方法承粤,用來獲取想要的結(jié)果暴区。

  • + (PHFetchResult<PHAssetCollection *> *)fetchAssetCollectionsWithType:(PHAssetCollectionType)type subtype:(PHAssetCollectionSubtype)subtype options:(nullable PHFetchOptions *)options;
    該方法是該類的主要訪問方法,主要用于在未知相冊的情況下辛臊,直接通過type和subtype從相冊獲取相應(yīng)的相冊仙粱。type和subtype如下所示:
typedef NS_ENUM(NSInteger, PHAssetCollectionType) {
 PHAssetCollectionTypeAlbum      = 1,  相冊,系統(tǒng)外的
 PHAssetCollectionTypeSmartAlbum = 2,  智能相冊彻舰,系統(tǒng)自己分配和歸納的
 PHAssetCollectionTypeMoment     = 3,  時(shí)刻伐割,系統(tǒng)自動(dòng)通過時(shí)間和地點(diǎn)生成的分組
 } PHOTOS_ENUM_AVAILABLE_IOS_TVOS(8_0, 10_0);
 *
 * typedef NS_ENUM(NSInteger, PHAssetCollectionSubtype) {
 
 // PHAssetCollectionTypeAlbum regular subtypes
 PHAssetCollectionSubtypeAlbumRegular         = 2, // 在iPhone中自己創(chuàng)建的相冊
 PHAssetCollectionSubtypeAlbumSyncedEvent     = 3, // 從iPhoto(就是現(xiàn)在的圖片app)中導(dǎo)入圖片到設(shè)備
 PHAssetCollectionSubtypeAlbumSyncedFaces     = 4, // 從圖片app中導(dǎo)入的人物照片
 PHAssetCollectionSubtypeAlbumSyncedAlbum     = 5, // 從圖片app導(dǎo)入的相冊
 PHAssetCollectionSubtypeAlbumImported        = 6, // 從其他的相機(jī)或者存儲設(shè)備導(dǎo)入的相冊
 
 // PHAssetCollectionTypeAlbum shared subtypes
 PHAssetCollectionSubtypeAlbumMyPhotoStream   = 100,  // 照片流,照片流和iCloud有關(guān)刃唤,如果在設(shè)置里關(guān)閉了iCloud開關(guān)隔心,就獲取不到了
 PHAssetCollectionSubtypeAlbumCloudShared     = 101,  // iCloud的共享相冊,點(diǎn)擊照片上的共享tab創(chuàng)建后就能拿到了尚胞,但是前提是你要在設(shè)置中打開iCloud的共享開關(guān)(打開后才能看見共享tab)
 
 // PHAssetCollectionTypeSmartAlbum subtypes
 PHAssetCollectionSubtypeSmartAlbumGeneric    = 200,
 PHAssetCollectionSubtypeSmartAlbumPanoramas  = 201,  // 全景圖硬霍、全景照片
 PHAssetCollectionSubtypeSmartAlbumVideos     = 202,  // 視頻
 PHAssetCollectionSubtypeSmartAlbumFavorites  = 203,  // 標(biāo)記為喜歡、收藏
 PHAssetCollectionSubtypeSmartAlbumTimelapses = 204,  // 延時(shí)拍攝笼裳、定時(shí)拍攝
 PHAssetCollectionSubtypeSmartAlbumAllHidden  = 205,  // 隱藏的
 PHAssetCollectionSubtypeSmartAlbumRecentlyAdded = 206,  // 最近添加的唯卖、近期添加
 PHAssetCollectionSubtypeSmartAlbumBursts     = 207,  // 連拍
 PHAssetCollectionSubtypeSmartAlbumSlomoVideos = 208,  // Slow Motion,高速攝影慢動(dòng)作(概念不懂)
 PHAssetCollectionSubtypeSmartAlbumUserLibrary = 209,  // 相機(jī)膠卷
 PHAssetCollectionSubtypeSmartAlbumSelfPortraits PHOTOS_AVAILABLE_IOS_TVOS(9_0, 10_0) = 210, // 使用前置攝像頭拍攝的作品
 PHAssetCollectionSubtypeSmartAlbumScreenshots PHOTOS_AVAILABLE_IOS_TVOS(9_0, 10_0) = 211,  // 屏幕截圖
 PHAssetCollectionSubtypeSmartAlbumDepthEffect PHOTOS_AVAILABLE_IOS_TVOS(10_2, 10_1) = 212,  // 在可兼容的設(shè)備上使用景深攝像模式拍的照片(概念不懂)
 PHAssetCollectionSubtypeSmartAlbumLivePhotos PHOTOS_AVAILABLE_IOS_TVOS(10_3, 10_2) = 213,  // Live Photo資源
 PHAssetCollectionSubtypeSmartAlbumAnimated PHOTOS_AVAILABLE_IOS_TVOS(11_0, 11_0) = 214,  // 沒有解釋
 PHAssetCollectionSubtypeSmartAlbumLongExposures PHOTOS_AVAILABLE_IOS_TVOS(11_0, 11_0) = 215,  // 沒有解釋
 // Used for fetching, if you don't care about the exact subtype
 PHAssetCollectionSubtypeAny = NSIntegerMax
 } PHOTOS_ENUM_AVAILABLE_IOS_TVOS(8_0, 10_0);
  • + (PHFetchResult<PHAssetCollection *> *)fetchAssetCollectionsWithLocalIdentifiers:(NSArray<NSString *> *)identifiers options:(nullable PHFetchOptions *)options;
    通過identifier的數(shù)組來查找到相應(yīng)的資源,不過這里的identifier應(yīng)使用上面的方法獲取到相冊后拿到的相冊的identifier(根據(jù)屬性localIdentifier即可獲取到)躬柬,否則會得到意想不到的結(jié)果拜轨。測試代碼如下:
- (IBAction)fetchCollectionWithIdentifier:(id)sender {
    // 先試試用圖片的identifier
    NSMutableArray * assetIdentifierArr = [NSMutableArray array];
    NSMutableArray * identifierArr = [NSMutableArray array];
    PHFetchResult<PHAssetCollection *> * result = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
    [result enumerateObjectsUsingBlock:^(PHAssetCollection * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        if (obj.localIdentifier.length > 0) {
            NSLog(@"%@--%@", obj.localIdentifier, obj.localizedTitle);
            [identifierArr addObject:obj.localIdentifier];
            PHFetchResult<PHAsset *> * assetResult = [PHAsset fetchAssetsInAssetCollection:obj options:nil];
            PHAsset * asset = assetResult.firstObject;
            [assetIdentifierArr addObject:asset.localIdentifier];
        }
    }];
    // 注意:這里使用的是單個(gè)資源的identifier
    PHFetchResult<PHAssetCollection *> * assetIdentifierResult = [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:assetIdentifierArr options:nil];
    [assetIdentifierResult enumerateObjectsUsingBlock:^(PHAssetCollection * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        if (obj.localIdentifier.length > 0) {
            NSLog(@"%@", obj);
        }
    }];
    NSLog(@"================================");
// 注意:這里使用的是相冊的identifier
    PHFetchResult<PHAssetCollection *> * identifierResult = [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:identifierArr options:nil];
    [identifierResult enumerateObjectsUsingBlock:^(PHAssetCollection * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        if (obj.localIdentifier.length > 0) {
            NSLog(@"%@", obj);
        }
    }];
}

可以先預(yù)想一下結(jié)果,然后再看下面的截圖:
image.png

上面的使用也再一次的證明了identifier一定要使用代碼獲取到的才行允青。

  • + (PHFetchResult<PHAssetCollection *> *)fetchAssetCollectionsContainingAsset:(PHAsset *)asset withType:(PHAssetCollectionType)type options:(nullable PHFetchOptions *)options;
    查找包含資源asset的相冊
  • + (PHFetchResult<PHAssetCollection *> *)fetchAssetCollectionsWithALAssetGroupURLs:(NSArray<NSURL *> *)assetGroupURLs options:(nullable PHFetchOptions *)options;
    舊版的圖片框架和新版框架的交互橄碾,不過到了今天,已經(jīng)基本上不用考慮該方法的調(diào)用了。
  • + (PHFetchResult<PHAssetCollection *> *)fetchMomentsInMomentList:(PHCollectionList *)momentList options:(nullable PHFetchOptions *)options;
  • + (PHFetchResult<PHAssetCollection *> *)fetchMomentsWithOptions:(nullable PHFetchOptions *)options;
    上面的兩個(gè)方法是獲取Moment相冊的簡單方法
  • + (PHAssetCollection *)transientAssetCollectionWithAssets:(NSArray<PHAsset *> *)assets title:(nullable NSString *)title;
  • + (PHAssetCollection *)transientAssetCollectionWithAssetFetchResult:(PHFetchResult<PHAsset *> *)fetchResult title:(nullable NSString *)title;
    利用已知資源創(chuàng)建一個(gè)新的集合或者說相冊堪嫂,但是該相冊不會被永久存儲下來偎箫。具體的使用后面再說吧。

2皆串、PHCollectionList

該類用來表示集合的集合淹办。但是我并沒有發(fā)現(xiàn)怎么創(chuàng)建出該現(xiàn)象。而如果不創(chuàng)建(假如可以創(chuàng)建但是沒創(chuàng)建)時(shí)恶复,在實(shí)際的調(diào)用中怜森,得到的結(jié)果和預(yù)想的也不一樣,有些困惑谤牡,所以副硅,這一節(jié)暫時(shí)先放放吧。

3翅萤、PHAsset

該類表示具體的資源信息恐疲,如寬度、高度套么、時(shí)長培己、是否是收藏的等等。同上面提到的幾個(gè)類一樣胚泌,該類的屬性也都是只讀的省咨,所以我們主要是用它的方法來獲取資源。

  • - (BOOL)canPerformEditOperation:(PHAssetEditOperation)editOperation;
    用來判斷該資源是否可以做某些操作玷室,比如增刪改查零蓉。也從另一個(gè)方面暗示了,在對該資源做一些操作之前有必要先做一下判斷穷缤,這可以省去一些不必要的麻煩敌蜂。
  • + (PHFetchResult<PHAsset *> *)fetchAssetsInAssetCollection:(PHAssetCollection *)assetCollection options:(nullable PHFetchOptions *)options;
    該方法是從相冊中獲取單個(gè)資源的主要途徑:
- (IBAction)useToFetchCollection:(id)sender {
    // 先獲取到集合
    PHFetchResult<PHAssetCollection *> * collectionResult = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeSmartAlbumFavorites options:nil];
    if (collectionResult.count == 0) {
        return;
    }
    // 遍歷集合,獲取信息
    [collectionResult enumerateObjectsUsingBlock:^(PHAssetCollection * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        PHFetchResult<PHAsset *> * assetResult = [PHAsset fetchAssetsInAssetCollection:obj options:nil];
        NSLog(@"%@", assetResult);
    }];
}
  • + (PHFetchResult<PHAsset *> *)fetchAssetsWithLocalIdentifiers:(NSArray<NSString *> *)identifiers options:(nullable PHFetchOptions *)options;
    該方法的使用和PHAssetCollection的相同津肛,是個(gè)查找功能紊册;如果identifier是隱藏的資源,默認(rèn)是會被找到的快耿,如果不想找到隱藏的,可以通過options的屬性includeHiddenAssets來設(shè)置(貌似沒什么用)芳绩。
  • + (PHFetchResult<PHAsset *> *)fetchAssetsWithBurstIdentifier:(NSString *)burstIdentifier options:(nullable PHFetchOptions *)options;
    根據(jù)identifier獲取連拍資源掀亥,如果傳遞的identifier不是連拍資源的identifier,即使相冊里有匹配的資源妥色,也不會返回搪花。不過蘋果官方說明:默認(rèn)只會獲取一些具有代表性的,如果想獲取全部的連拍資源,需要在options里做處理撮竿。
  • + (PHFetchResult<PHAsset *> *)fetchAssetsWithOptions:(nullable PHFetchOptions *)options;
    在相機(jī)膠卷中根據(jù)options來獲取合適的資源
  • + (PHFetchResult<PHAsset *> *)fetchAssetsWithMediaType:(PHAssetMediaType)mediaType options:(nullable PHFetchOptions *)options;
    在相機(jī)膠卷中根據(jù)mediaType媒體類型和options獲取匹配的資源
  • + (nullable PHFetchResult<PHAsset *> *)fetchKeyAssetsInAssetCollection:(PHAssetCollection *)assetCollection options:(nullable PHFetchOptions *)options;
    獲取相冊資源的封面圖吮便,根據(jù)相冊類型的不同,返回的資源封面的個(gè)數(shù)也不同幢踏。
    如果是零時(shí)的相冊髓需,是沒有封面的。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末房蝉,一起剝皮案震驚了整個(gè)濱河市僚匆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌搭幻,老刑警劉巖咧擂,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異檀蹋,居然都是意外死亡松申,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進(jìn)店門俯逾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來贸桶,“玉大人,你說我怎么就攤上這事纱昧∨傩ィ” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵识脆,是天一觀的道長设联。 經(jīng)常有香客問我,道長灼捂,這世上最難降的妖魔是什么离例? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮悉稠,結(jié)果婚禮上宫蛆,老公的妹妹穿的比我還像新娘。我一直安慰自己的猛,他們只是感情好耀盗,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著卦尊,像睡著了一般叛拷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上岂却,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天忿薇,我揣著相機(jī)與錄音裙椭,去河邊找鬼。 笑死署浩,一個(gè)胖子當(dāng)著我的面吹牛揉燃,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播筋栋,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼炊汤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了二汛?” 一聲冷哼從身側(cè)響起婿崭,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎肴颊,沒想到半個(gè)月后氓栈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡婿着,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年授瘦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片竟宋。...
    茶點(diǎn)故事閱讀 38,789評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡提完,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出丘侠,到底是詐尸還是另有隱情徒欣,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布蜗字,位于F島的核電站打肝,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏挪捕。R本人自食惡果不足惜粗梭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望级零。 院中可真熱鬧断医,春花似錦、人聲如沸奏纪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽序调。三九已至躬窜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間炕置,已是汗流浹背荣挨。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留朴摊,地道東北人默垄。 一個(gè)月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像甚纲,于是被迫代替她去往敵國和親口锭。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容