PhotoKit에 대해 알아봅시다!

delma·2020년 3월 17일
1

iOS

목록 보기
9/16
post-thumbnail

iCloud Photos나 아이폰 사진 앱에서 사진, 라이브 포토 등을 가져오도록 도와주는 PhotoKit 에 대해 알아봅시다!

공식문서 기반으로 작성했습니다




PhotoKit?

iCloud Photos 및 Live Photos를 포함하여 Photos 앱에서 관리하는 이미지 및 동영상을 가지고 일한다.


Overview

iOS와 macOS에서, PhotoKit은 사진 앱을 위한 클래스를 제공한다. 해당 클래스는 building photo-editing extension을 지원한다.
또한, Photos 앱에서 관리하는 사진 및 동영상에 직접 접근하도록 제공한다.

PhotoKit을 사용하면, 이미지나 동영상을 편집하거나 앨범의 이미지 컬렉션을 관리하거나 cache assets을 가져와 재생하거나 디스플레이 할 수 있다.



포토킷이 뭐하는 놈인지 알아봤으니, 사용하기 위해 구체적으로 어떤 클래스 등이 준비되어있는지 알아봅시다!


Asset Retrieval

PHPhotoLibrary

사용자의 공유 사진 라이브러리에 대한 액세스 및 변경을 관리하는 공유 객체

shared PHPhotoLibrary 객체는 Photos 앱에 로컬 디바이스와 iCloud Photos에 저장된 assets 둘다 포함하여 관리되는 전체 assets과 컬렉션을 표시한다.

  • 사용자의 앱에서 사진에 접근하기 위한 권한을 가져오거나 확인해야 한다
  • 새로은 asset을 삽입하거나 asset 메타데이터나 컨텐츠 혹은 컬렉션의 멤버들을 재배열 하면서 asset 및 컬렉션을 변경하는 작업을 할 수 있다
  • library에 변화가 있을 때 전송하는 업데이트 메시지를 등록한다.

PHAsset

Photos library의 사진, 동영상, Live 포토의 표현.
하나의 asset을 담는 클래스로 낱개의 사진이나 동영상이 여기에 담긴다.

fetchAssets(in:options:)와 같은 메소드로 사진첩에서 사진을 PHAsset타입으로 가져온다. asset은 오직 메타데이터만 포함하고 있다.
어떤 asset이라도 내부의 이미지나 비디오 데이터는 로컬 디바이스에 저장되지 않을 수도 있다. 이 asset 데이터를 어떻게 사용할지에 따라 모든 데이터를 다운로드할 필요는 없을 수 있다. 컬렉션 뷰에 썸네일 이미지를 채울 필요가 있는 경우, Photos 프레임워크는 각 asset에 대한 미리보기 다운로드, 생성 및 캐싱을 관리할 수 있다. 더 자세한 사항은 PHImageManger를 보면 된다.

asset은 immutable하다. 그래서 asset의 메타데이터를 편집하려면 사진라이브러리 change 블록 내에 PHAssetChangeRequest 객체를 생성해야 한다.

PHAssetCollection

사용자가 생성한 앨범이나 스마트 앨범과같은 사진 asset의 그룹 표현. asset 컬렉션.

Photos 프레임워크에서 asset collection을 포함한 컬렉션 오브젝트는 멤버 오브젝트(their member objects)를 직접적으로 참조하지 않고, 컬렉션 오브젝트를 직접적으로 참조하는 다른 객체도 없다. asset collection의 멤버(asset)을 가져오려면 PHAsset 클래스의 fetchAssets(in:options:) 메소드를 사용하면 된다.
asset collection을 찾기 위해 Fetching Asset Collections의 메소드 리스트 중 하나를 이용하면 된다.

asset과 컬렉션처럼 asset collection은 불변 객체다. asset collections를 생성, 리네임, 삭제하거나 asset collection에 멤버를 추가, 삭제, 재정렬시 PHAssetCollectionChangeRequest 객체를 photo library change block 안에 생성하면 된다.

PHCollection

Photo asset collections와 collection 리스트의 추상화된 슈퍼클래스.

이 클래스를 직접적으로 생성할 필요 없다. 대신, 서브클래스인 PHAssetCollection이나 PHCollectionList 중 하나를 사용하면 된다.

PHCollectionList

사용자 생성 폴더나 연도 폴더, Moments 폴더등이 모여있는 asset collections 그룹을 말한다.

Overview

Photos 프레임워크에서 asset collection을 포함한 컬렉션 오브젝트는 멤버 오브젝트(their member objects)를 직접적으로 참조하지 않고, 컬렉션 오브젝트를 직접적으로 참조하는 다른 객체도 없다. collection list의 멤버(collection)을 가져오려면 PHCollection 클래스의 fetchCollections(in:options:) 메소드를 사용하면 된다.
collection list 계층에 루트 오브젝트를 찾으려면 fetchTopLevelUserCollections(with:) 메소드를 사용하면 된다.

이 클래스 역시 fetch한 정보는 Immutable하기 때문에, PHCollectionListChangeRequest를 통해 수정할 수 있다.

PHFetchResult

Photos fetch 메소드로부터 리턴된 asset이나 collection의 순서 목록.

Declaration

class PHFetchResult<ObjectType> : NSObject where ObjectType : AnyObject

Overview

PHAset, PHCollection, PHAsetCollection 및 PHCollectionList 클래스에서 클래스 메서드를 사용하여 객체를 검색하면 Photos는 결과 객체를 fetch result로 제공한다.

NSArray 클래스에서 사용하는 것과 동일한 메서드로 fetch result의 컨텐츠에 접근할 수 있다. 허나 NSArray 객체와 달리 PHFetchResult 객체는 필요에 따라 Photos 라이브러리에서 컨텐츠를 동적으로 로드해 많은 수의 결과를 처리할 때도 최적의 성능을 제공한다.

fetch result는 그 내용에 대해 스레드 세이프한 접근을 제공한다. fetch 후에, fetch result의 count value는 상수다. 그리고 fetch result 안의 모든 객체는 동일한 localIdentifier 값을 유지한다. (가져올 내용을 업데이트 하려면 PHPhotoLibrary 객체를 옵저버로 등록하면 된다.)

fetch result는 가장 최근에 접근한 인덱스 주위에 배치(a batch of objects)를 보관하면서 그 내용을 캐시한다. 배치 외부에 있는 개체는 더이상 캐싱되지 않으므로 이러한 개체에 액세스하면 해당 개체가 다시 캐싱된다. 이런 과정은 이전에 해당 개체에서 읽은 값의 변화를 가져올 수 있다.



Asset Loading

PHImageManager

썸네일과 asset data를 생성하거나 가져오는 걸 가능하게 하는 객체

Declaration

class PHImageManager : NSObject

full-size 사진 asset, 썸네일 이미지를 가져오거나 비디오 asset을 재생, 플레잉, 조작하기 위해 AVFoundation 객체를 가져올 때 아래의 메소드를 사용한다.

이미지나 비디오 데이터 로드하기
1. PHAsset 클래스를 사용해 asset을 가져온다
2. default() 메소드를 호출해 공유된 이미지 매니저 오브젝트를 가져온다
3. 이미지나 비디오 베이터를 로드하기 위해 아래의 메소드를 사용한다.

Requesting Images


func requestImage(for: PHAsset, targetSize: CGSize, contentMode: PHImageContentMode, options: PHImageRequestOptions?, resultHandler: (UIImage?, [AnyHashable : Any]?) -> Void) -> PHImageRequestID
func requestImageDataAndOrientation(for: PHAsset, options: PHImageRequestOptions?, resultHandler: (Data?, String?, CGImagePropertyOrientation, [AnyHashable : Any]?) -> Void) -> PHImageRequestID
let PHImageManagerMaximumSize: CGSize

profile
🌐Code makes world better

1개의 댓글

comment-user-thumbnail
2020년 3월 17일

와 나중에 델마 책쓰실 것 같아요...
대단하십니다 👍

답글 달기