나만의 공부 노트
Photos에 관하여 본문
일단 PhotoKit은
Photos와 PhotosUI로 나뉘어지는 듯하다
Photos는 주로 사진, 비디오를 가져오기, 수정 저장 등을 하는 작업에 쓰이는 것 같고
PhotosUI는 필터와 같은 사용자 수준의 편집을 지원하는 것 같다. (쓰면서 공부하는거라 추측성 발언...ㅜㅜ 아래에서 확실히 배울거임)
+
core data와 유사한 부분이 많이 보인다.
아마 core data을 응용해서 사용하고 있는게 아닐까?
예를 들어 model은 phasset, phassetcollection 등으로 정의되어있구
context는 PHImageManger 칭구들이구(phassetrequest가 transaction인듯)
-> 흠.. PHImageManger은 단순히 가져오기, 생성 담당이고
-> 따로 PHChangeRequsest를 통해 바로 PhotoLibrary에 수정사항을 알리는듯?
coordinator는 PHPhotoLibrary인듯?
데이터베이스는 무조건 사진첩 하나이니깐.. 컨테이너도 하나.. 코디네이터도 하나...
얼추 맞는 거 같은데... 코어 데이터 다시 공부해야지
+
You fetch assets to begin working with them. Use the class methods listed in Fetching Assets to retrieve one or more PHAssetinstances representing the assets you want to display or edit.
Assets contain only metadata. The underlying image or video data for any given asset might not be stored on the local device. However, depending on how you plan to use this data, you may not need to download all of it. If you need to populate a collection view with thumbnail images, the Photos framework can manage downloading, generating, and caching thumbnails for each asset. For details, see PHImageManager. -> 가져올땐 PHImageManager를 통해서 가져와라!
Asset objects are immutable. To edit an asset’s metadata (such as marking it as a favorite photo), create a PHAssetChangeRequestobject within a photo library change block. For more details on using change requests and change blocks to update the photo library, see PHPhotoLibrary. -> 바꿀땐 PHAssetChangeRequset를 통해서!
Asynchronously runs a block that requests changes to be performed in the photo library.
-> 바꿀 땐 바로 PHPhotoLibrary에 알려주네.. 왜 PHImageManager를 거치지 않고 바꾸게 만들었을까잉.. 헷갈리게
+
caching 이용하고 싶으면 PHImageManager을 상속받은 PHCachingImageManager를 이용하자!(확장만 한듯)
기본부터 파보자!
1. 모든 PhotoKit객체는 PHObject라는 기본 클래스에서 상속됩니다.
주의 할 점은 이 클래스의 인스턴스를 직접(directly)만들거나, 사용하면 안됩니다.
대신, 구체적인 하위클래스인 PHAsset, PHAssetCollection, PHCollectionList 및 PHObjectPlaceholder의 인스턴스로 작업해야합니다. PHObject클래스는 localbIdentifier프로퍼티에 따라 isEqual(_ :) 및 해시 메소드를 구현합니다. 이러한 메소드를 사용하여 asset및 collection 객체를 추적 할 수 있습니다. <- 그냥 interface같은 느낌이고, 기본적으로 얘도 NSObject 상속 받넹
2. PHAsset은 사용자의 사진 라이브러리에 있는 하나의 asset을 나타내며, 해당 asset의 메타데이터(중요)를 제공합니다.
PHAsset 하나의 이미지, 비디오, 또는 라이브사진을 나타냅니다.
PHObject의 하위클래스입니다.
asset을 가져와 작업을 시작합니다. -> 기본적으로 PHAssetCollection에서 에셋 배열을 가져와서 사용을 시작하는 듯(최소 fetch단위)
class func fetchAssets(in: PHAssetCollection, options: PHFetchOptions?) -> PHFetchResult<PHAsset>
Retrieves assets from the specified asset collection.
과 같이 클래스 메소드를 사용하여 표시하거나 or 이렇게 가져온 배열에서 내가 수정하려는 asset을 나타내는 하나 이상의 PHAsset인트선스를 가져옵니다.
asset은 메타데이터만 포함됩니다(Assets contain only metadata). 특정 asset의 기본 이미지 또는 비디오 데이터가 로컬 디바이스에 저장되지 않을 수 있습니다. 그러나 이 데이터를 어떻게 사용 할 건지에 따라, 모든 데이터를 다운로드 할 필요가 없을 수도 있습니다. 썸네일 이미지로 collection view를 채울 필요가 있는 경우, Photos프레임워크는 각 asset의 썸네일을 다운로드, 생성 및 캐싱 할 수 있습니다. 자세한 내용은 PHImageManager참고. -> asset은 PHImageManager를 통해 수정하는듯(transaction?)
Asset 객체를 변경할 수 없습니다(Asset objects are immutable). asset의 메타데이터(예: 즐겨찾는 사진으로 표시)를 편집하려면, 사진 라이브러리 변경 블록 내에 PHAssetChangeRequest객체를 만듭니다. 변경 요청을 사용하고, 블록을 변경하여 사진 라이브러리를 업데이트 하는 방법에 대한 자세한 내용은 PHPhotoLibrary를 참고하세요.
-> 그러니까 내가 asset을 바로 직접 변경하는 거는 불가능하고, "변경 요청 객체"를 만들어서 요청해서 업데이트 하는 수 밖에 없음.
-> 변경은 PHImageManager를 이용하는게 아닌가.. 일단 쭉 보면서 확인해보자
3. PHCollection은 asset collection을 위한 추상 슈퍼클래스입니다. 물론 이 역시 PHObject를 상속받고 있습니다.
PHObject와 마찬가지로, 이 PHCollection의 인스턴스를 직접 만들거나 이 인스턴스로 작업하면 안됩니다. 대신 PHAssetCollection또는 PHCollectionList라는 두개의 구체적인 하위 클래스 중 하나를 사용해야합니다.
-> ㅇㅋ 인터페이스 같은 역할
4. PHAssetCollection객체는 앨범, Moment 또는 공유사진 스트림과 같은 사진 또는 비디오 asset의 collection을 나타냅니다.
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를 참고하세요.
5. PHCollectionList객체는 앨범이 포함된 폴더 또는 한 해의 모든 moment집합과 같은 다른 collection을 포함하는 collection입니다.
asset collections의 모음이라고 생각하시면 됩니다. 역시나 PHCollection의 하위클래스입니다.
Photos프레임워크에서 collction객체(asset collection포함)는 해당 구성원 객체를 직접 참조하지 않으며, collection객체를 직접 참조하는 다른 객체는 없습니다. collection list의 멤버를 검색하려면 fetchCollections(in : options :)와 같은 PHCollection클래스 메소드를 사용하여 가져옵니다. 상위 폴더가 없는 앨범 폴더와 같은 collection list계층의 루트에서 객체를 찾으려면 fetchTopLevelUserCollections(with:)메소드를 사용합니다.
이 역시 사용자의 명시적인 승인이 필요하구요.
collection list를 생성, 이름 변경 또는 삭제, collection list에 멤버를 추가, 제거 또는 재정렬 하려면 사진 라이브러리 변경 블록내에 PHCollectionListChangeRequest객체를 만듭니다. 변경 요청을 사용하고 블록을 변경하여 사진 라이브러리를 업데이트 하는 방법에 대한 자세한 내용은 PHPhotoLibrary를 참고하세요.
PhotoLibrary를 파보자!
사용자의 공유 사진 라이브러리 접근 및 변경을 관리하는 shared 객체입니다. 이건 PHObject의 하위 클래스는 아니고, NSObject의 하위클래스입니다.
shared PHPhotoLibrary객체는 로컬 디바이스에 저장된 asset과 (활성화 된 경우) iCould Phtos에 저장된 asset을 포함하여 사진앱에서 관리하는 전체 asset 및 collection집합을 나타냅니다. 이 객체는 다음 작업에 사용됩니다.
- 앱이 사진 컨텐츠에 접근 할 수 있는 사용자 권한을 얻거나 확인합니다.
- assets 및 collection을 변경합니다. 예를들어, asset메타데이터 또는 콘텐츠 편집, 새 asset 삽입 또는 collection구성원 재배치.
- 라이브러리가 변경 할 때 전송된 업데이트 메세지 등록
FetchRequest를 알아보자!
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를 등록하세요.) -> 아하 PhotoLibrary(coordinator)로 변경을 일괄적으로 관리하고 context 느낌의 imageMangager는 가져오기만 수행! 코어 데이터랑 약간 다르구만
fetch result는 컨텐츠를 캐시하여, 객체 한 묶음(batch)을 가장 최근에 액세스한 인덱스 주위에 유지합니다.(오...)
배치 외부의 객체는 더이상 캐시되지 않으므로 이러한 객체에 접근하면 해당 객체를 다시 가져올 수 있습니다. 이 프로세스를 수행하면 해당 객체에서 이전에 읽은 값이 변경 될 수 있습니다. -> 코어 데이터의 캐싱인가?
FetchOptions을 알아보자!
말그대로 fetch하는데 사용되는 "옵션"입니다.
정의를 보면, assets 또는 collection객체를 가져올 때 Photos에서 반환하는 결과(result)의 필터링, 정렬 및 관리에 영향을 주는 일련의 옵션입니다. <- 코어 데이터에서도 predicate 및 sortDescriptor가 필요했죠?
PHAsset, PHCollection, PHAssetCollection 및 PHCollectionList 클래스에서 클래스 메서드를 사용하여 assets 또는 collection을 fetch하면, 요청한 객체가 포함된 PHFetchResult객체가 생성됩니다. 지정한 옵션에 따라 fetch result에 포함된 객체, 정렬방법, fetch result의 변경사항을 앱에 알리는 방법을 제어 할 수 있습니다.
Photos는 predicate 및 sortDescriptor프로퍼티에 대해, 제한된 key집합만 지원합니다. 사용 가능한 key set은 assets 또는 collection을 가져오는 데 사용하는 클래스에 따라 다릅니다. 각 클래스에서 지원되는 key 목록은 다음을 참고하세요. -> 코어데이터에서는 프로퍼티 이름이 key가 됬으니, 여기선 모델이 정해져 있어서 키가 딱 고정인듯