Lined Notebook

PHAsset에 관하여(with. How to get PHAsset filename)

by 사슴비행기

 

해당 글은 공부를 위해 공식문서를 번역한 글입니다.

 

PHAsset은 사진 라이브러리를 이용해서 이미지나, 비디오, 라이브 포토를 다룰 때 받아지는 객체인데,

최근에 PHAsset의 메타데이터에 접근해서 이미지의 이름을 받아오는 작업을 하다가 PHAsset으로 무얼 할 수 있는지 갑자기 궁금해져서 애플 공식문서에 나와 있는 글을 해석해봐야겠다는 생각에 이 글을 작성하게 되었다.

 

A representation of an image, video, or Live Photo in the Photos library.
사진 라이브러리에 있는 이미지, 비디오 또는 Live Photo의 표현입니다.

 

You fetch assets to begin working with them.
자산을 가져와 작업을 시작합니다.
Use the class methods listed in Fetching Assets to retrieve one or more PHAsset instances representing the assets you want to display or edit.
자산 가져오기에 나열된 클래스 메서드를 사용하여 표시하거나 편집하려는 자산을 나타내는 하나 이상의 PHAsset 인스턴스를 검색합니다.

 

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 PHAssetChangeRequest object within a photo library change block.
자산의 메타데이터(예: 즐겨찾는 사진으로 표시)를 편집하려면 사진 라이브러리 변경 블록 내에 PHAssetChangeRequest 객체를 생성합니다.
For more details on using change requests and change blocks to update the photo library, see PHPhotoLibrary.
변경 요청 및 변경 블록을 사용하여 사진 라이브러리를 업데이트하는 방법에 대한 자세한 내용은 PHPhotoLibrary를 참조하십시오.

 

솔직히 말해서 무슨 소린지 도통 모르겠다...

하지만 대충 중요한 부분은 PHAsset의  Object는 변경할 수 없고, 메타데이터는 변경할 수 있다 정도인 것 같다.

PHImageManager로 PHAsset을 가져올 수 있고,

PHAssetChangeRequest를 생성해서 메타데이터를 편집할 수 있는데, 이 편집을 사진 라이브러리에 업데이트하려면 PHPhotoLibrary를 사용한다는 것 정도..?

 

근데 여기서 궁금한 점은,

구글링해서 내가 사진 이름을 가져오기 위해서 사용한 코드는 아래와 같은데,

 

 asset.value(forKey:"filename")

 

공식문서를 아무리 뒤져봐도 이  key 값으로 무얼 쓸 수 있는지 나오질 않는다는 것이다.

뭐지..?

그래서 열심히 구글링을 해보니,

내가 쓴 방법은 일종의 트릭이란다..

공식문서에서는 API(iOS9 이후)로 자산 데이터를 가져오라고 안내하고 있다는 것이다.

공식문서에서 권장하는 방법은 아래와 같다.

 

let resource = PHAssetResource.assetResources(for: asset)
let fileName = resource.first?.originalFilename

 

오호..
나는 BSImagePicker 라는 라이브러리를 사용하고 있는데
(여러 장의 사진을 가져오기 위해서임)


그런데 순정으로 하게 되면 여러 PHAsset을 래핑을 해제하고 순회해서, 리소스를 만들고 이름을 가져와야 하는 모양이다..
즉, 시간이 더 오래 걸린다는 의미다.

(하지만 키값을 모두 조회해서 가져오는 것도 시간이 걸린다는 의견도 있더라)

→ 이 부분에 관해 추가적인 글

 

PHAsset에 관하여2(with. iOS버전별 사용법, PHPicker)

저번 글에서 PHAsset을 순정으로 가져오기 위해서는 래핑을 해제하고 순회해야 한다고 했는데 이 방법이 변경되어 추가적으로 글을 쓰게 되었다. 이전에는 fetchAsset 메서드를 통해서 PHAsset을 가져

doorganizedcoding.tistory.com

 

아무튼 그래서 내가 처음에 쓴 방법 같은 속임수를 사용하는 경우가 생긴 것 같다.
하지만 이건 공식문서에서 권장하는 방법이 아니기 때문에
언제 사라질지 알 수 없는 기능이라고 하니
업데이트될 때마다 잘 작동하는지 확인해야 한다는 거다.

 

 

더럽게 귀찮네..
그러므로, 상황에 맞다면 공식문서에서 권장하는 방법을 쓰는 게 좋을 것 같긴 하다.
그리고....

 

 

하지만 나는 속임수인 방법이어도 어떠한 key 들이 있는지 궁금한걸?!
그렇지만 온종일 샅샅이 뒤져도 도저히 나오질 않아서
어쩔 수 없이 포기..
일단 공식문서에도 없는 이런 야매방법... 안 쓰는 게 낫다는 게 결론.
그리고 트릭으로 가져온 값이 내부 이름이긴 한데 원본 이름이 아니다?
라는 말도 있어서(무슨 소리인지는 모르겠지만)
그냥 안 쓰기로 결정...ㅠㅠ

그리고 정말 구글링하면서 도움을 많이 받았고 받고 있는 zedd님이 photokit 쓰는 거 포스팅 해 놓은 게 있길래 나중에 이것도 공부해야겠다.

 

 


참고한 글들

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

https://zeddios.tistory.com/620

https://lazyowl.tistory.com/entry/iOS-PHAsset-이미지-파일명과-파일-크기-가져오기

https://jcsoohwancho.github.io/2019-11-28-Key-Value-Coding(KVC)/

https://slk11075.medium.com/traps-for-phasset-how-to-get-filename-from-phasset-67d856e75c64

https://stackoverflow.com/a/43271224

https://stackoverflow.com/questions/40627901/how-to-get-file-name-in-uiimagepickercontroller-with-asset-library

블로그의 정보

Beautiful Coding

사슴비행기

활동하기