Photos
- Photos은 iOS, tvOS에서 사진, 비디오에 접근하기 위한 프레임워크이다.
- Photos을 사용하려면
import Photos
를 선언해주면 된다.
- Photos는 프레임워크를 사용하여 에셋을 검색하고 에셋을 사용하여 미디어를 요청하는 작업할 수 있다.
Asset (이미지, 비디오, 라이브 포토 등 각각의 미디어 개체)
Asset Collection (애셋들을 모아놓은 앨범, 특별한 순간)
Collection List (앨범 폴더, 특별한 순간)
- 이러한 애셋들은 오직 메타 데이터만 가지고 있지 실제 그 이미지나 비디오를 가지고 있는건 아니라서 PHImageManager 객체들을 이용해 애셋의 이미지를 가져오거나 AVFoundation을 이용해 비디오를 로드해야 한다.
- 만약 변경 요청을 하려면 변경 요청 객체를 만들고 PHPhotoLibrary 객체에 알려줘야한다.
PHPhotoLibrary
- 이 객체를 이용해 사진 콘텐츠에 접근, 애셋 및 컬렉션을 변경하도록 애플리케이션의 사용자 권한을 얻는다. 권한을 얻으면 사진 라이브러리가 변경되면 변경사항을 받을 수 있다.
info.plist
에 이러한 내용을 기술한다.
에셋 검색에 관련된 클래스
PHAsset
- 사진 라이브러리 이미지, 비디오, 라이브 포토
PHAssetCollection
- 특별한 순간, 사용자정의 앨범, 스마트 앨범 등의 에셋 그룹
PHCollectionList
PHFetchResult
- fetch 메서드에서 반환된 에셋 또는 컬렉션 목록인데 선언이 제네릭으로 되어있어서 보통 다음과 같이 사용한다.
let result: PHFetchResult<PHCollectionList> =
PHCollectionList.fetchAssetCollections(with: .smartAlbum, subtype: .smartAlbumUserLibrary, options: nil)
PHFetchOptions
- 에셋 또는 컬렉션 객체를 가져올때 필터링, 정렬 등의 옵션을 주는 객체
에셋 콘텐츠 로딩
PHImageManager
- 썸네일 이미지 및 에셋 데이터를 쉽게 검색하거나 생성하기 위한 객체인데, 여기 있는 메소드를 사용해서 전체 크기 사진이나 온전한 사진, 썸네일을 가져올 수 있다.
PHCachingImageManager
- 많은 양의 에셋을 한번에 로딩하기 위해 최적화 되어 있는데, 위의 PHImageManager와는 달리 미리보기 썸네일을 검색하거나 생성할 때 사용한다.
- 예를 들어 사진 또는 비디오 에셋 썸네일을 이용해서 컬렉션 뷰 셀 같은 객체를 채우려면 PHImageManager 보다는 이걸 사용하는게 더 낫다.
- 많은 에셋이 필요할 때 빠른 성능을 위해서 이 객체는 지연을 방지하려고 에셋 이미지를 백그라운드에서 준비해두기 때문.
PHImageRequestOptions
- 이미지 매니저에 요청한 에셋 이미지에 적용되는 옵션
PHVideoRequestOptions
- 이미지 매니저에 요청한 비디오 에셋에 적용되는 옵션
PHLivePhotoRequestOptions
- 이미지 매니저로부터 요청한 라이브 포토 에셋에 적용되는 옵션
PHLivePhoto
- 캡처 직전과 직후 순간의 움직임 및 소리가 포함된 라이브 사진 애셋
변경 요청
PHAssetChangeRequest
- 사진 라이브러리 변경을 요청하는 에셋의 생성, 삭제, 메타 데이터 수정 변경 객체
PHAssetCollectionChangeRequest
- 애셋 컬렉션의 생성, 삭제, 수정 변경 요청 객체
PHCollectionListchangeRequest
- 컬렉션 리스트의 생성, 삭제, 수정 변경 요청 객체
정리하자면 앱에서 이미지를 가져오기 위한 메커니즘은 다음과 같다.
- 에셋을 fetch하기 위해 PHFetchResult 객체를 선언하고 가져오려는 해당 에셋 종류의 클래스에 있는 fetch 메소드를 이용해서 에셋을 가져온다
- 가져온 에셋으로 이미지 매니저를 통해 실제 이미지 데이터를 요청한다.
- 변경 사항이 있으면 PHAssetChangeRequest 같은 변경 요청 객체를 생성하고 이미지 매니저를 통해 요청한다.
출처: 네이버 부스트코스 iOS 앱 프로그래밍