본문으로 바로가기

[PhotoKit] PHAsset을 추출하기.

category Mobile Application/iOS 2015. 3. 5. 14:42

추출하기라는 표현이 적당한지 모르겠지만,
ALAsset처럼 URL을 뽑아내어 배열에 담고 싶었다.

비슷한 작업을 PhotoKit으로 대체하는 부분이라서 그 부분이 필요했다고 하는게 적당하겠다.

우선 문서를 찾아보니 PHAsset 클래스에 "fetchAssetsWithLocalIdentifiers"라는 메소드가 보였다.
첫 번째 파라메터로는 NSArray 타입의 identifier을 전달하는 것인데, 이 identifier를 찾을 수가 없었다.

찾다 찾다가 PHAsset 클래스가 PHObject 클래스를 상속하고 있는데, PHObject에 localIdentifier 프로퍼티가 존재한다.

"A unique string that persistently identifies the object. (read-only)" 와 같이 설명되어 있다.

PHCollection도 PHObject 클래스를 상속받고 있으니,
앨범 이름의 identifier가 필요하면 PHAsset과 마찬가지로 localIdentifier 프로퍼티를 참조하면 된다.

     __block NSString *localIdentifier = nil;
    // 카메라 롤 앨범을 읽어온다.        
    PHFetchResult *smartFolderLists = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum
                                                                          subtype:PHAssetCollectionSubtypeSmartAlbumUserLibrary
                                                                          options:nil];

        PHAssetCollection *smartFolderAssetCollection = (PHAssetCollection *)[smartFolderLists firstObject];

        // 카메라 롤에 있는 사진을 가져온다.    
        PHFetchResult *assets = [PHAsset fetchAssetsInAssetCollection:smartFolderAssetCollection  options:nil];
        [assets enumerateObjectsUsingBlock : ^(PHAsset *asset, NSUInteger idx, BOOL *stop) {
                 // PHAsset에서 localIdentifier 프로퍼티를 읽는다.
                localIdentifier = asset.localIdentifier;
                *stop = YES;
        }];

위의 소스를 활용해 localIdentifier를 메모리에 저장했다가 필요한 부분에서 다음 소스를 활용하여 사용한다면
AssetsLibrary처럼 URL을 활용하여 사진 오브젝트를 얻을 수 있다. AssetsLibrary의 URL이 identifier로 바뀐것이라고 생각하자.

PHFetchResult *asset = [PHAsset fetchAssetsWithLocalIdentifiers:@[@"6E5438ED-9A8C-4ED0-9DEA-AB2D8F8A9360/L0/001"] options:nil];

소스 상에 "6E5438ED-9A8C-4ED0-9DEA-AB2D8F8A9360/L0/001"는 시물레이터 추출한 localIdentifier를 직접 넣었다.