2013-08-04 2 views
4

다음 코드는 사용자 라이브러리의 모든 사진에 대한 EXIF ​​데이터를 성공적으로 검사하고 주어진 위치와 가까운 지리적 위치에서 찍은 사진 배열을 완료 블록으로 전달합니다 해당 위치에서 찍은 가장 최근 사진의 NSDate입니다.ALAssetsLibrary 위치에서 사진 가져 오기

- (void)getPhotosAtLocation:(CLLocation *)location withCompletionBlock:(void (^)(NSError *, NSDate *, NSMutableArray *))completionBlock { 
    NSMutableArray *photos = [NSMutableArray array]; 
    ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init]; 
    __block NSDate *latestDate = [[NSDate alloc] initWithTimeIntervalSince1970:0]; 
    [assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup *group, BOOL *stop) { 
     [group enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) { 
      if (result) { 
       ALAssetRepresentation *representation = [result defaultRepresentation]; 
       NSDictionary *imageMetadata = [representation metadata]; 
       NSLog(@"%@", imageMetadata); 
       //analyze location 
       if ([imageMetadata objectForKey:@"{GPS}"]) { 
        double latitude = [[[imageMetadata objectForKey:@"{GPS}"] objectForKey:@"Latitude"] doubleValue]; 
        if ([[[imageMetadata objectForKey:@"{GPS}"] objectForKey:@"LatitudeRef"] isEqualToString:@"S"]) 
         latitude *= -1; 
        double longitude = [[[imageMetadata objectForKey:@"{GPS}"] objectForKey:@"Longitude"] doubleValue]; 
        if ([[[imageMetadata objectForKey:@"{GPS}"] objectForKey:@"LongitudeRef"] isEqualToString:@"W"]) 
         longitude *= -1; 
        if (fabs(location.coordinate.latitude - latitude) <= 0.0005 && fabs(location.coordinate.longitude - longitude) <= 0.0005) 
         [photos addObject:[UIImage imageWithCGImage:[result thumbnail]]]; 
        //analyze last time at location 
        if ([imageMetadata objectForKey:@"{TIFF}"]) { 
         NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
         [formatter setDateFormat:@"yyyy:MM:dd HH:mm:ss"]; 
         NSDate *tempDate = [[NSDate alloc] init]; 
         tempDate = [formatter dateFromString:[[imageMetadata objectForKey:@"{TIFF}"] objectForKey:@"DateTime"]]; 
         if ([tempDate compare:latestDate] == NSOrderedDescending) { 
          latestDate = tempDate; 
         } 
        } 
       } 
      } 
     }]; 
     if ([latestDate isEqualToDate:[NSDate dateWithTimeIntervalSince1970:0]]) 
      completionBlock(nil, [NSDate date], photos); 
     else 
      completionBlock(nil, latestDate, photos); 
    } failureBlock:^(NSError *error) { 
     completionBlock(error, nil, nil); 
    }]; 
} 

내가 직면하고있어 문제는 특정 위치에서 찍은 모든 사진을 찾기 위해, 나는 (O를 가지고 사용자의 카메라 롤에서 모든 사진을 통해 선형 반복해야한다는 것입니다 (n)의 시간). 반복하기 전에 위도와 경도로 사진 순서를 정하도록함으로써이 과정을 신속하게 처리 할 수 ​​있습니까? 어떤 종류의 알고리즘이 관련 이미지를 반환하는 데 걸리는 시간을 최소화 할 수 있습니까?

답변

0

모든 사진을 한 번 반복하고 이미 처리 한 사진의 속성 배열을 유지해야한다고 생각합니다. 이렇게하면 다음에 반복 할 때 새 사진 만 처리하게됩니다.

+0

가능합니다. 당신이 말하는 것은 적어도 현재 사용자의 라이브러리에있는 사진 수 (n)를 캐시하고 다음에 인덱스 n (라이브러리의 첫 번째 새 사진)에서 검색을 시작하는 것입니다. 물론, 문제는 처음부터 모든 사진을 한 번 이상 반복해야한다는 것입니다. 현재 휴대 전화의 저장 용량을 수용하면 수천 개의 저장된 사진을 반복 할 수 있습니다. –

+0

사진을 캐시 (n)하지만 삭제 된 사진도 준비하십시오. 반복 자체가 오랜 시간이 걸리거나 프로세스 속도를 늦추는 메타 데이터 검사입니까? 매번 수천 장의 사진을 반복 할 생각 이었지만 캐시 된 사본이 없다면 메타 데이터 만 확인하십시오. – gWiz