【问题标题】:ALAssetsLibrary Get Photos At LocationALAssetsLibrary 在位置获取照片
【发布时间】:2013-08-05 12:11:55
【问题描述】:

以下代码成功检查了用户库中所有照片的 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) 时间)。是否可以通过让系统在迭代之前按纬度和经度对照片进行排序来加快此过程?什么样的算法可以最大限度地减少返回相关图像所花费的时间?

【问题讨论】:

    标签: ios objective-c algorithm alassetslibrary


    【解决方案1】:

    我认为您应该对所有照片进行一次迭代,并从您已处理的照片中保留一系列属性。这样,下次迭代时,您将只处理新照片。

    【讨论】:

    • 这是可能的。我认为您的意思是至少缓存当前在用户库中的照片数量(n),然后下次在索引 n(库中的第一张新照片)处开始搜索。当然,问题在于这首先需要对所有照片至少迭代一次。鉴于当今手机的存储容量,这可能意味着迭代存储的数千张照片。
    • 缓存 (n) 张照片,但也要为已删除的照片做好准备。迭代本身是否需要很长时间,还是元数据检查会减慢进程?我想更多的是每次都遍历数千张照片,但只有在没有照片的缓存副本时才检查元数据。
    【解决方案2】:

    您似乎正在寻找某种空间索引。在“空间索引”部分查看可能的列表:http://en.wikipedia.org/wiki/Spatial_database

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-11
      相关资源
      最近更新 更多