Следующий код успешно проверяет данные 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), которые в настоящее время находятся в библиотеке пользователя, а затем в следующий раз начните поиск по индексу n (первая новая фотография в библиотеке). Проблема, конечно же, в том, что это требует повторения всех фотографий, по крайней мере, один раз в первую очередь. Учитывая, что емкость памяти на телефонах теперь распространяется, это может потенциально означать повторение тысяч сохраненных фотографий. –
Фотографии кеша (n), но будьте готовы к удаленным фотографиям. Является ли сама итерация длительным временем или является проверкой метаданных, которая замедляет процесс? Я думал больше об итерации через тысячи фотографий каждый раз, но проверяю только метаданные, если у вас нет кэшированной копии фотографии. – gWiz