2013-08-04 3 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 (п)). Возможно ли ускорить этот процесс, если система упорядочивает фотографии по широте и долготе перед итерацией? Какой алгоритм может свести к минимуму время, затрачиваемое на возврат соответствующих изображений?

ответ

0

Кажется, что вы ищете какой-то пространственный указатель. Посмотрите здесь, в разделе «Пространственный индекс», чтобы просмотреть список возможностей: http://en.wikipedia.org/wiki/Spatial_database.

0

Я думаю, что вы должны перебирать все фотографии один раз и сохранять массив свойств из фотографий, которые вы уже обработали. Таким образом, в следующий раз, когда вы выполните итерацию, вы будете обрабатывать только новые фотографии.

+0

это возможно. Я думаю, что вы говорите, это кеш, по крайней мере, количество фотографий (n), которые в настоящее время находятся в библиотеке пользователя, а затем в следующий раз начните поиск по индексу n (первая новая фотография в библиотеке). Проблема, конечно же, в том, что это требует повторения всех фотографий, по крайней мере, один раз в первую очередь. Учитывая, что емкость памяти на телефонах теперь распространяется, это может потенциально означать повторение тысяч сохраненных фотографий. –

+0

Фотографии кеша (n), но будьте готовы к удаленным фотографиям. Является ли сама итерация длительным временем или является проверкой метаданных, которая замедляет процесс? Я думал больше об итерации через тысячи фотографий каждый раз, но проверяю только метаданные, если у вас нет кэшированной копии фотографии. – gWiz

Смежные вопросы