티스토리 뷰

iOS

[iOS]PhotoKit 알아보기(2)

Esiwon 2022. 11. 20. 23:00

PhotoKit 통해 기기 사진 라이브러리에 접근 권한을 받아오는 방법에 대해서
PhotoKit 알아보기(1) 글을 참고하시기 바랍니다.

 

이번 글에서는 부여받은 권한을 이용하여 기기의 저장된 이미지 Asset을 가져오는 방법에 대해서 알아보겠습니다.

이미지 Asset을 가져오기 위해선 PHFetchResult 객체를 통해 가져올 수 있지만, PHFetchResult 객체를 사용하기 위해선 PHAsset과 PHAssetCollection에 대해 알고 있어야 합니다.

 

하지만, 두 객체는 PHObject를 상속받기 때문에 PHObject 먼저 알아보겠습니다.

PHObject

PHObject는 공식문서에 따르면, 직접 인스턴스를 만들거나 사용하면 안됩니다.
하위 클레스인 PHAsset, PHAssetCollection, PHCollectionList, PHObjectPlaceholder를 사용하라고 나와있습니다.

 

PHObject는 var localIdentifier: String라는 프로퍼티를 가지고 있으며, 이는 PHObject를 상속받은 객체의 추적에 사용될 수 있습니다. "사진첩 만들기" 글에서 사용되는 예시를 보여드리겠습니다.

 

이제 PHAsset에 대해 알아보겠습니다.

PHAsset

class PHAsset : PHObject

PHAsset은 이미지, 비디오, 라이브 사진 등의 메타데이터를 가지고 있는 객체입니다.

Photos 프레임워크의 PHImageManager객체는 PHAsset을 이용하여 이미지 등을 다운로드, 생성 및 캐싱 할 수 있습니다.
PHImageManager에 대해서는 다음 글에서 자세하게 알아보겠습니다.

 

또한, PHAsset은 자신의 메타데이터를 직접 수정할 수 없습니다. 메타데이터의 수정이 필요한 경우 PHAssetChangeRequest 객체를 이용해야 하는데 이 또한 다음 글에서 자세하게 다뤄보도록 하겠습니다.

한마디로 정리하자면, PHAsset 이미지, 비디오, 라이브 사진에 대한 메타데이터를 가지고 있는 객체 정도로 알면 될 것 같습니다.

다음은 PHAssetCollection에 대해 알아볼 차례입니다. 그런데 PHAssetCollection이 PHCollection을 상속받고 있네요.

 

PHCollection 대해 먼저 알아보겠습니다.

PHCollection

class PHCollection : PHObject

PHCollection는 AssetCollection 및 CollectionList에 대한 추상 클래스입니다. PHObject와 같이 직접 인스턴스를 만들어 작업하지 말라고 공식문서에 나와있습니다.

 

자 이제 PHAssetCollection의 추상 클래스를 간단하게 알아보았으니, PHAssetCollection 객체에 대해서 알아보겠습니다.

PHAssetCollection

class PHAssetCollection : PHCollection

PHAssetCollection은 간단하게 말해 PHAsset의 집합입니다. 때문에 PHAssetCollection을 이용하여 특정 집합의 PHAsset을 가져올 수 있습니다. 집합을 가져오는 방법은

class func fetchAssetCollections(
    with type: PHAssetCollectionType,
    subtype: PHAssetCollectionSubtype,
    options: PHFetchOptions?
) -> PHFetchResult<PHAssetCollection>

위 메서드를 통해 가져올 수 있습니다. 메서드를 호출하면, 특정 PHAsset의 집합을 가진 다음 글에서 소개될 PHFetchResult타입이 반환되게 되는데 반환된 타입에 요청을 보내 PHAsset을 가져올 수 있습니다. 이제 파라미터에 대해 하나하나 알아보겠습니다.

type: PHAssetCollectionType

이는 집합의 유형입니다.(가장 큰 단위? 라고 생각하면 좋을것 같습니다.)

  • album = 흔히 생각하는 사진앱의 앨범
  • smartAlbum = 콘텐츠가 동적으로 업데이트되는 앨범
  • moment = 시간과 위치별로 그룹화된 집합

⚠️
album과 smartAlbum의 차이점
album으로 설정하면, 기기 사용자가 직접 만든 앨범에서만 이미지 Asset을 가져오게 됩니다. 즉, 사용자가 직접 사진을 분류해야 한다는 얘기입니다.
하지만, smartAlbum같은 경우 사진앱에 있는 모든 사진을 시스템이 알아서 분류해 주게 됩니다. 때문에 사용자가 직접 사용자 지정 앨범을 만들어 이미지를 분류할 필요 없이 subtype에 맞게 분류하여 가져오게 됩니다. 자세한 내용은 "Difference Between iPhoto Album and Smart Album"글을 참고하세요.

subtype: PHAssetCollectionSubtype

이는 좀 더 상세한 유형입니다. PHAssetCollectionType의 하위 유형이라고 생각하시면 될 것 같습니다. smartAlbum 같은 경우 다양한 하위 유형을 가지고 있습니다. 예를 들어, 모든 사진, 즐겨찾기로 설정한 사진, 파노라마 사진, Live 사진 등 다양한 유형이 있습니다. 다양한 유형이 있으니깐 공식문서에서 확인하세요.

options: PHFetchOptions?

Asset 또는 Collection를 가져올 때 Photos가 반환하는 결과의 필터링, 정렬 및 관리에 영향을 주는 일련의 옵션입니다.

var predicate: NSPredicate?를 통해 필터링을
var sortDescriptors: [NSSortDescriptor]? 통해 정렬을 할 수 있습니다.

위는 타입별로 지원하는 Key값입니다.

다시 PHAssetCollection으로 돌아와 PHAssetCollection또한 PHAsset과 비슷하게 직접 변경이 불가능하고, PHAssetCollectionChangeRequest 객체를 사용해서 변경 요청을 보낼 수 있습니다. 자세한 내용은 다음 글에서 알아보겠습니다.

 

이걸로 이번 글을 마치며, 다음 글에선 PHImageManager, PHAssetChangeRequest, PHAssetCollectionChangeRequest, PHFetchResult 객체들에 대해서 알아보겠습니다.

'iOS' 카테고리의 다른 글

[iOS] Coordinator Pattern  (0) 2023.01.09
[iOS]PhotoKit 알아보기(최종)  (1) 2022.11.22
[iOS]PhotoKit 알아보기(1)  (0) 2022.11.20
[iOS] TextView Placeholder 구현하기  (0) 2022.11.01
[iOS] 모듈 만들기  (1) 2022.10.20
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함