ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [iOS] Photos Framework를 알아보자. (간단히)
    앱등이에게 살충제를 뿌린다./iOS 2017. 3. 11. 22:55


    as of iOS10.2, XCode8, Swift3



    앱에서 사진첩에 있는 사진, 동영상을 보여줄일이 많습니다.

    이 때, Photos 프레임워크를 사용해야합니다.

    기존에는 AssetsLibrary 프레임워크를 많이 사용했지만 iOS9에 들어서 Deprecated되었다. 대체로 사용해야할 프레임워크가 바로 Photos프레임워크인거죠.


    Photos 프레임워크에 있는 클래스는 PH라는 Prefix를 갖습니다. ex) PHAsset, PHCollection 등등.


    Photos 프레임워크를 사용해야 한다는 사실을 알았으니, 이 글에서는 Photos에서 제공하는 주요 클래스들에 대한 이야기를 해볼까합니다.

    (야 다 집어치코 샘플코드내놔 하시는 분은 링크를 클릭) -> 링크

    • PHAsset
    • PHAssetCollection
    • PHCollectionList
    • PHCollection
    • PHFetchResult
    • PHImageManager


    이 여섯 가지 클래스들에 대한 이야기를 해보겠습니다.


    PHAssethttps://developer.apple.com/reference/photos/phasset

    말그대로 하나의 Asset을 담는 클래스입니다. 

    사진 한장한장이 각각 PHAsset클래스에 담길거에요. 동영상도 마찬가지입니다.

    즉, PHAsset은 낱 개의 사진 또는 동영상을 표현하는 클래스입니다.

    fetchAssets(in:options:)와 같은 메소드를 통해 사진첩에서 사진을 PHAsset타입으로 가져올 수 있습니다.


    PHAsset에서 바로 UIImage로의 전환을 상상할만도 한데요. 사실 PHAsset은 사진의 메타데이터를 가져올 뿐입니다.

    그래서 여섯 번째로 소개드릴 예정인 PHImageManager의 도움을 받아야 이미지를 추출할 수 있습니다.


    또한 가져온 PHAsset은 Immutable합니다. 이 데이터들을 수정하려면 PHAssetChangeRequest라는것을 이용해야하는데요. 

    자세한 정보는 Document를 참고하시길 바랍니다.



    PHAssetCollectionhttps://developer.apple.com/reference/photos/phassetcollection

    이름에서 짐작할 수 있듯, PHAsset의 set이라고 생각하면 편합니다.

    정확히는 사용자가 만든 앨범, 순간(Moment)등의 앨범이라고 생각하면 편하겠네요.

    이 클래스는 네 번째 소개드릴 PHCollection의 서브클래스입니다.


    이 클래스도 PHAsset과 유사하게 fetchAssets(in:options:) 와 같은 메소드를 이용해 앨범정보를 가져옵니다.

    마찬가지로 fetch하여 얻은 정보는 Immutable하며 PHAssetCollectionChangeRequest를 생성하여 수정할 수 있습니다. 

    이 또한 위에 링크드린 Document를 참고하시길 바랍니다.



    PHCollectionListhttps://developer.apple.com/reference/photos/phcollectionlist

    마찬가지로 이름에서 기능이 유추됩니다. 바로 Asset 컬렉션들의 리스트를 나타냅니다. 즉, 앨범들의 리스트라고 볼 수 있겠네요.

    2014년 앨범, 사용자가 만든 앨범들의 리스트 등이 이에 해당하겠습니다.

    fetchCollections(in:options:)와 같은 메소드를 이용해서 컬렉션리스트를 가져옵니다.


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

    자세한 정보는 위에 링크한 Document를 참고해주세요.



    PHCollection - https://developer.apple.com/reference/photos/phcollection

    이 클래스는 사실 Abstract Class(인터페이스)역할을 합니다. 위에서 설명한 두 클래스 PHAssetCollection과 PHCollectionList가 PHCollection을 상속받습니다.

    PHAssetCollection, PHCollectionList의 선언부분을 보면 두 클래스 모두 PHCollection은 상속하고 있는것을 확인할 수 있습니다.


    두 클래스에서 공통으로 사용하는 메소드들의 일부가 PHCollection클래스에 선언이 되어 있겠네요.



    PHFetchResult - https://developer.apple.com/reference/photos/phfetchresult

    이 포스트를 쓰게 된 이유가 바로 Document에서 PHFetchResult클래스를 찾아보다가 정리가 필요하겠다 싶었기 때문입니다.

    Document에서는 PHFetchResult를 한줄로 정리하여 An ordered list of assets or collections returned from a Photos fetch method.라고 하고 있습니다.

    위에서 Asset, Collection들을 설명하면서 fetch메소드를 사용해야 한다고 설명했습니다. 바로 이 fetch하는 메소드들의 return 타입이 바로 PHFetchResult타입입니다.


    PHAsset, PHCollection, PHCollecionList, PHAssetCollection클래스의 fetch 메소드를 사용하면 각 구현에 알맞는 asset 또는 collection의 리스트가 PHFetchResult로 리턴이 될텐데요. PHFetchResult는 리스트의 성격을 갖고 있는 만큼, NSArray의 메소드와 같은 메소드들을 사용할 수 있습니다.

    예를 들어, count라는 프로퍼티를 통해 fetch한 asset 또는 collection의 수를 알 수 있습니다.

    index(of: )메소드를 사용하여 특정 aset 또는 collection을 가져올 수도 있구요.


    PHFetchResult의 Document를 확인하면 정말 많은 멤버메소드를 갖고 있으며, NSArray와 같은 메소드들을 갖고 있다는것을 확인할 수 있습니다.



    PHImageManager - https://developer.apple.com/reference/photos/phimagemanager

    PHImageManager 클래스는 asset이나 thumbnail을 조회하거나 생성하는 메소드들을 제공합니다.

    그래서 Document를 보면 대부분의 메소드가 request로 시작합니다.

    requestImage... requestLivePhoto... 등등 말이죠.


    PHImageManager의 메소드 하나만 같이 살펴보고 마치겠습니다. https://developer.apple.com/reference/photos/phimagemanager/1616964-requestimage

    func requestImage(for asset: PHAsset

           targetSize: CGSize

          contentMode: PHImageContentMode

              options: PHImageRequestOptions?, 

        resultHandler: @escaping (UIImage?, [AnyHashable : Any]?) -> Void) -> PHImageRequestID

    PHAsset을 전달받네요. 그리고 resultHandler는 UIImage를 전달받는 클로져네요.

    직감하셨나요?


    이 메소드에 PHAsset을 전달한 뒤, 클로져를 구현해주면 전달한 PHAsset에 해당하는 사진을 UIImage로 전달받아 클로져를 실행하게 됩니다.



    이상으로 Photos 프레임워크에서 제공하는 대표적인 클래스들을 모두 살펴보았습니다.

    다른 대표적인 클래스들도 있겠지만 이 정도면 앨범에서 폴더리스트/사진리스트 등을 가져오는데는 문제가 없으리라 생각되네요.

    문의사항/태클은 언제나 댓글로 환영합니다~!





Designed by Tistory.