달력

9

« 2019/9 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  •  
  •  
  •  
  •  
  •  

지난 토요일 아침에 침대에 누워서 밍기적 대다가 iOS8에서 사라진 camera roll을 처리했다는 글을 보게 되었다..


https://medium.com/a-startup-hustlers-guide/%EC%9A%B0%EB%A6%AC%EB%A5%BC-%EB%8B%B9%ED%99%A9%EC%8B%9C%ED%82%A8-ios-8-%EC%82%AC%EC%A7%84-914d441deeba


바로 일어나서 PhotoKit을 보기 시작했다가 그냥 별 성과 없이 주말을 보내고 어제 다시 보기 시작했는데 오늘에서야 결국 해냈다.. ㄷㄷㄷ


저 링크에 있는 글을 읽은 후라 그런지 저 글에 나온대로 전체 사진 리스트를 얻어와서 겹치는 사진들을 제외하는 방법으로 접근을 했던게 시간을 잡아먹게 됐고 오늘 아침에 다른 분과 잠깐 이에 대해 얘기를 하다가 아이디어가 생각이 나서 그대로 했더니 해결이 되었다..


서론이 길었고.. 소스 나간다.. ㅎㅎ



                    

        PHFetchOptions *options = [[PHFetchOptions alloc] init];
        options.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"startDate" ascending:NO]];
        NSMutableArray *aAll = [[NSMutableArray alloc] init];

        __block BOOL bBusy = YES;

        PHFetchResult *smartAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeMoment subtype:PHAssetCollectionSubtypeAlbumRegular options:options];
        [smartAlbums enumerateObjectsUsingBlock:^(PHAssetCollection* collection, NSUInteger idx, BOOL *stop) {
            
            PHFetchOptions *options = [[PHFetchOptions alloc] init];
            options.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:NO]];
            PHFetchResult* assets2 = [PHAsset fetchAssetsInAssetCollection:collection options:options];
            [assets2 enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
                
                [aAll addObject:obj];
                
            }];
            
            bBusy = !stop;

        }];

        while (bBusy)
            [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];

        NSLog(@"aAll count : %d", (int)aAll.count);
        assetGridViewController.assetsFetchResults = aAll;


사진 앱에서 첫번째 탭인 사진을 보면 날짜나 장소 등의 기준으로 사진이 분류가 된다. 이게 PhotoKit에서 얘기하는 컬렉션 타입 중에 PHAssetCollectionType 이다. 이 타입으로 컬렉션을 가지고 오면 사진 탭에 있는 리스트를 가지고 올 수 있게 되고 각각의 컬렉션에 포함되어 있는 사진들을 다시 읽어오면 전체 사진 리스트를 겹치지 않게 가지고 올 수 있게 된다.


위 소스는 애플에서 제공하고 있는 컴파일도 제대로 안되는 PhotoKit 샘플에 적용을 하느라 저런 모양이 됐고 컬렉션 목록을 가지고 오는 enumerateObjectsUsingBlock이 끝날때 화면을 갱신시켜준다거나 원하는 다른 작업을 하면 된다.


어제 사진들 리스트를 얻어오기 위해 PhotosTypes.h에 정의되어있는 데이터 타입들을 천천히 살펴보고 왠만한건 테스트도 해보고 그랬는데, 기존 ALAsset보다 PhotoKit에 새로 추가된 기능들이 많이 있어서 이쪽은 좀더 프로토타이핑을 해볼 필요가 있을 것 같기는 하다. 


PhotoKit의 구조나 용어들에 대한 설명은 딱히 하지 않았는데 그건 셀프임.. ㅋㅋ

암턴 Cameral Roll이 사라진 것에 대한 문제는 해결을 했으니 CameraW 다음 버전에도 적용을 하고 오픈소스 올렸던것에도 적용을 해야겠다.. 훗..

굿보이


끗~


참.. PhotoKit에 대한 예제는 애플 샘플에 잘 나와있는데 이 샘플이 다운을 받아서 컴파일을 하면 컴파일 에러가 남.. -_-;; info.plist 파일을 못읽는다고 에러가 나는데 프로젝트안에 SamplePhotosAppTests 요 폴더를 만들고 그 안에 info.plist를 카피해주고 프로젝트에 있던 파일 지우고 요걸 다시 넣어주면 컴파일이 잘 됨.. 애플 PhotoKit 담당자야.. 우리 잘좀 하자.. 응?


PS : iOS 8.0.2에서 이 문제가 패치되어서 더이상 이 소스를 쓸 일은 없을 듯.. 다행(?)이다.. ㅎㅎ


Posted by 도노보노