ALAssetsLibrary获取指定位置的照片

4
以下代码成功检查了用户库中所有照片的EXIF数据,并将与给定位置在地理上接近的照片的数组以及拍摄于该位置的最新照片的NSDate传递给完成块。
- (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)时间)。是否可以通过让系统在迭代之前按纬度和经度对照片进行排序来加快此过程?哪种算法可以最小化返回相关图像所需的时间?

2个回答

0

0
我认为你应该遍历所有照片一次,并保留已处理照片的属性数组。这样,下次迭代时,你只会处理新的照片。

这是可能的。我认为你所说的是至少缓存当前用户库中的照片数量(n),然后下次从索引n(库中第一张新照片)开始搜索。当然,问题在于这首先需要遍历所有照片。鉴于现在手机的存储容量,这可能意味着要遍历数千张已存储的照片。 - The Kraken
缓存(n)照片,但也要准备好删除的照片。是迭代本身需要很长时间,还是元数据检查减慢了进程?我想更多地遍历每次数千张照片,但如果您没有缓存的照片副本,则仅检查元数据。 - gWiz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接