티스토리 뷰

iOS

iOS ) PhotoKit (1)

Zedd0202 2018. 10. 27. 18:04
반응형

안녕하세요 :) Zedd입니다. 

오늘은 PhotoKit을 공부해보려고 합니다.


PhotoKit



PhotoKit도....프레임워크라고 할 수 있겠죠?

프레임워크라고 언급이 안되어있긴 한데........ Objc에서 프레임워크라고 언급하니까 저도 PhotoKit을 프레임워크라고 말할게요

Photos 프레임워크와 PhotosUI 프레임워크를 가지고 있는 프레임워크...........같습니다.

정의는 "사진앱이 관리하는 이미지와 비디오 aseets을 포함하여 iCloud 이미지 및 Live 이미지를 사용합니다"


iOS 및 macOS에서 PhotoKit은 사진앱의 사진 편집 확장 기능을 지원하는 클래스를 제공합니다. 

iOS 및 tvOS에서 PhotoKit은 사진 앱이 관리하는 사진 및 동영상 assets에 직접 접근 할 수도 있습니다.

PhotoKit을 사용하면, 표시 및 재생을 위해 assets을 가져오고 캐시할 수 있으며, 이미지 및 비디오 내용을 편집하거나, albums, Moments 및 shared albums assets collection을 관리할 수 있습니다. 


구구절절 설명했지만, 일단 iOS관점에서 생각한다고 가정하고..PhotoKit을 사용하면 내 사진앱에 사진들, 비디오들, 앨범에 접근하여 해당 assets들을 가져오는 것들이 가능해진다..!라는 것입니다. 


PhotoKit은 사진앱에서 사용자에게 표시되는 객체를 모델링하는 엔티티 그래프를 정의한다고 해요. 이 사진 엔티티는 가볍고(lightweight) 불변(immutable)입니다. 

모든 PhotoKit객체는 PHObject라는 기본 클래스에서 상속됩니다.

주의 할 점은 이 클래스의 인스턴스를 직접(directly)만들거나, 사용하면 안됩니다. 

대신, 구체적인 하위클래스인 PHAsset, PHAssetCollection, PHCollectionList 및 PHObjectPlaceholder의 인스턴스로 작업해야합니다. PHObject클래스는 localIdentifier프로퍼티에 따라 isEqual (_ :) 및 해시 메소드를 구현합니다. 이러한 메소드를 사용하여 asset및 collection 객체를 추적 할 수 있습니다.  



PHAsset은 사용자의 사진 라이브러리에 있는 하나의 asset을 나타내며, 해당 asset의 메타데이터를 제공합니다.

"an"< 보이시죠? PHAsset 하나의 이미지, 비디오, 또는 라이브사진을 나타냅니다. 

위에서 말했듯이 PHObject의 하위클래스입니다.


asset을 가져와 작업을 시작합니다. Fetching Assets에 나열된 클래스 메소드를 사용하여 표시하거나, 수정하려는 asset을 나타내는 하나 이상의 PHAsset인트선스를 가져옵니다.

asset은 메타데이터만 포함됩니다(Assets contain only metadata). 특정 asset의 기본 이미지 또는 비디오 데이터가 로컬 디바이스에 저장되지 않을 수 있습니다. 그러나 이 데이터를 어떻게 사용 할 건지에 따라, 모든 데이터를 다운로드 할 필요가 없을 수도 있습니다. 썸네일 이미지로 collection view를 채울 필요가 있는 경우,  Photos프레임워크는 각 asset의 썸네일을 다운로드, 생성 및 캐싱 할 수 있습니다. 자세한 내용은 PHImageManager참고.


Asset 객체를 변경할 수 없습니다(Asset objects are immutable). asset의 메타데이터(예: 즐겨찾는 사진으로 표시)를 편집하려면, 사진 라이브러리 변경 블록 내에  PHAssetChangeRequest객체를 만듭니다. 변경 요청을 사용하고, 블록을 변경하여 사진 라이브러리를 업데이트 하는 방법에 대한 자세한 내용은  PHPhotoLibrary를 참고하세요.

> 그러니까 내가 asset을 바로 직접 변경하는 거는 불가능하고, "변경 요청 객체"를 만들어서 요청해서 업데이트 하는 수 밖에 없음. 





asset collections은 PHAssetCollection클래스로 표시됩니다. 하나의 asset collection은 사진라이브러리의 앨범이나, moment일 뿐만 아니라, 스마트 앨범 중 하나일 수 있습니다. PHAssetCollection은 PHCollection의 하위클래스입니다. 

그럼 PHCollection부터 봅시다. 


PHCollection은 asset collection을 위한 추상 슈퍼클래스입니다. 물론 이 역시 PHObject를 상속받고 있습니다. 

PHObject와 마찬가지로, 이 PHCollection의 인스턴스를 직접 만들거나 이 인스턴스로 작업하면 안됩니다. 대신 PHAssetCollection또는 PHCollectionList라는 두개의 구체적인 하위 클래스 중 하나를 사용해야합니다. 


PHAssetCollection객체는 앨범, Moment 또는 공유사진 스트림과 같은 사진 또는 비디오 asset의 collection을 나타냅니다.


PHCollectionList객체는 앨범이 포함된 폴더 또는 한 해의 모든 moment집합과 같은 다른 collection을 포함하는 collection입니다


아하...아 정의를 보고 나니까 이름 정말 잘 지었네ㅐㅎ

CollectionList...


중요 : 사진 라이브러리에 접근하거나 수정하려면 사용자의 명시적인 승인이 필요합니다.  Fetching Collections에 나열된 방법 중 하나를 호출하면 사진이 자동으로 사용자에게 승인을 요청하는 메시지를 표시합니다. (또는 PHPhotoLibrary requestAuthorization (_ :) 메소드를 사용하여 원하는 시간에 사용자에게 메시지를 보낼 수 있습니다.)

앱의 info.plist파일은 앱이 사진 접근을 요청하는 이유를 사용자에게 설명하는 NSPhotoLibraryUsageDescription key 값을 제공해야합니다.

이 key가 없으면, iOS 10.0 또는 이후에 연결된 앱이 중단(crash)됩니다.



위에서 PHAssetCollection말할때 PHAssetCollection을 그냥 설명할까 하다가...딱딱 나누는게 좋을 것 같아서 따로따로 설명합니다.

PHAssetCollection.


Moment, 사용자 제작 앨범 또는 스마트 앨범과 같은 Photos asset그룹의 표현입니다. 

위에서 말했듯이 PHCollection의 하위클래스입니다. 

Photos프레임워크에서 (아 프레임워크 맞네)  collection객체(asset collections포함)는 해당 구성원 객체를 직접 참조하지 않으며, collection객체를 직접 참조하는 다른 객체는 없습니다. asset collections의 멤버를 검색하려면 fetchAssets (: options :)와 같은 PHAsset클래스 메소드를 사용합니다. asset collections을 찾으려면 Fetching Asset Collections에 나열된 메소드 중 하나를 사용하세요.


역시나 이것도 위에서 말했듯이 사용자의 명시적인 승인이 필요합니다. 

assets과 collection lists과 마찬가지로,  asset collections은 변경 불가능합니다. asset collections을 생성, 이름 변경 또는 삭제하거나 asset collections에 구성원 추가, 제거 또는 재정렬하려면 사진 라이브러리 변경 블록내에 PHAssetCollectionChangeRequest객체를 만듭니다. 변경 요청을 사용하고 블록을 변경하여 사진 라이브러리를 업데이트 하세요. 자세한 내용은 PHPhotoLibrary를 참고하세요.





PHCollectionList.

asset collections의 모음이라고 생각하시면 됩니다. 역시나 PHCollection의 하위클래스입니다.

Photos프레임워크에서 collction객체(asset collection포함)는 해당 구성원 객체를 직접 참조하지 않으며, collection객체를 직접 참조하는 다른 객체는 없습니다. collection list의 멤버를 검색하려면 fetchCollections(in : options :)와 같은 PHCollection클래스 메소드를 사용하여 가져옵니다. 상위 폴더가 없는 앨범 폴더와 같은 collection list계층의 루트에서 객체를 찾으려면 fetchTopLevelUserCollections(with:)메소드를 사용합니다.

이 역시 사용자의 명시적인 승인이 필요하구요.

collection list를 생성, 이름 변경 또는 삭제, collection list에 멤버를 추가, 제거 또는 재정렬 하려면 사진 라이브러리 변경 블록내에 PHCollectionListChangeRequest객체를 만듭니다. 변경 요청을 사용하고 블록을 변경하여 사진 라이브러리를 업데이트 하는 방법에 대한 자세한 내용은 PHPhotoLibrary를 참고하세요.


음...이제 중요한 클래스들은 조금 안 것 같아요. 근데 계속 사진 라이브러리를 업데이트 하려면 PHPhotoLibrary를 참고하라고 그러네요. 

PHPhotoLibrary를 알아봅시다. 

사용자의 공유 사진 라이브러리 접근 및 변경을 관리하는 shared 객체입니다. 이건 PHObject의 하위 클래스는 아니고, NSObject의 하위클래스입니다.

shared  PHPhotoLibrary객체는 로컬 디바이스에 저장된 asset과 (활성화 된 경우) iCould Phtos에 저장된 asset을 포함하여 사진앱에서 관리하는 전체 asset 및 collection집합을 나타냅니다. 이 객체는 다음 작업에 사용됩니다.

  • 앱이 사진 컨텐츠에 접근 할 수 있는 사용자 권한을 얻거나 확인합니다.
  •  assets 및 collection을 변경합니다. 예를들어, asset메타데이터 또는 콘텐츠 편집, 새 asset 삽입 또는 collection구성원 재배치. 
  • 라이브러리가 변경 할 때 전송된 업데이트 메세지 등록

ㅇㅋㅇㅋ

용어정리를 다시 해보자면, 
  • Assets: Images, videos, and Live Photos
  • Collections of assets: Albums or Moments
  • Lists of collections: Album folders or Moment clusters
입니다. 
계속 말했듯이, 위 클래스 인스턴스는 읽기 전용이며(read-only), 변경이 불가능하며 메타데이터만 포함합니다. 

자..그럼 우리가 이걸 도대체 알아서 모할까요;;;
ㅇㅇ우리 사진앱에 사진들이나 앨범들 일단 가져오는게 제일 기본(?)이겠죠?
일단 사진이나 앨범들을 fetch(가져오다)해야합니다. 
그걸 위해서 PHFetchResult라는 클래스를 알아야합니다. 

fetch method에서 반환된 asset또는 collection 정렬된 list입니다.

PHAsset, PHCollection, PHAssetCollection PHCollectionList 클래스의 클래스 메소드를 사용하여 객체를 검색(retrieve)하면, Photos 결과 객체를  fetch result 제공합니다.  fetch result 내용은 NSArray클래스에서 사용하는 것과 동일한 메소드 convention 사용하여 접근합니다. 그러나 NSArray객체와 달리, PHFetchResult객체는 필요에 따라 Photos라이브러리에서 내용을 동적으로 로드하므로 많은 수의 결과를 처리 때도 최적의 성능을제공합니다.

fetch result 내용에 대한 thread-safe 접근을 제공합니다. fetch후에 fetch result 카운트 값은 일정하며 fetch result의 모든 객체는 동일한 localIdentifier 유지합니다. (업데이트 컨텐츠를 가져오려면 shared PHPhotoLibrary객체에 change observer 등록하세요.)


fetch result 컨텐츠를 캐시하여, 객체 묶음(batch) 가장 최근에 액세스한 인덱스 주위에 유지합니다.(...)

배치 외부의 객체는 더이상 캐시되지 않으므로 이러한 객체에 접근하면 해당 객체를 다시 가져올 있습니다. 프로세스를 수행하면 해당 객체에서 이전에 읽은 값이 변경 있습니다. 


왠지 모르겠지만..아직 PHFetchResult 대해서 감이 안올 수도 있겠다는 생각이 듭니다.

코드를 보면 이해가 갈거니까(?) 일단은 뭔지만 아시면 됩니다. 


그리고 마지막 하나 PHFetchOptions라는 것을 알아야 합니다.

말그대로 fetch하는데 사용되는 "옵션"입니다.

정의를 보면, assets 또는 collection객체를 가져올 Photos에서 반환하는 결과(result) 필터링, 정렬 관리에 영향을 주는 일련의 옵션입니다.

PHAsset, PHCollection, PHAssetCollection PHCollectionList 클래스에서 클래스 메서드를 사용하여 assets 또는 collection fetch하면, 요청한 객체가 포함된 PHFetchResult객체가 생성됩니다. 지정한 옵션에 따라 fetch result 포함된 객체, 정렬방법, fetch result 변경사항을 앱에 알리는 방법을 제어 있습니다.

Photos predicate sortDescriptor프로퍼티에 대해, 제한된 key집합만 지원합니다. 사용 가능한 key set assets 또는 collection 가져오는 사용하는 클래스에 따라 다릅니다. 클래스에서 지원되는 key 목록은 다음을 참고하세요.

PHAsset이 제일 많군...


오늘은 일단 이정도만 보고! 2편에서 위에서 말한 클래스들을 사용해서 내 사진앱에 있는 사진들을 가져와봅시다. 

도움이 되었길 바래요 :)


PhotoKit(2)읽으러가기


출처 : 

https://developer.apple.com/documentation/photokit

https://www.objc.io/issues/21-camera-and-photos/the-photos-framework/#introduction


반응형