AssetLibrary 不返回带有“ALAssetsGroupAll”的所有资产
Posted
技术标签:
【中文标题】AssetLibrary 不返回带有“ALAssetsGroupAll”的所有资产【英文标题】:AssetLibrary not return all assets with "ALAssetsGroupAll" 【发布时间】:2014-05-20 12:40:27 【问题描述】:我正在使用以下代码查询资产库
ALAssetsLibrary *assetsLibrary = [self defaultAssetsLibrary];
[assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop)
NSMutableArray *tmpAssets = [@[] mutableCopy];
[group enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop)
if(result)
[tmpAssets addObject:result];
];
NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"date" ascending:NO];
finished([[tmpAssets sortedArrayUsingDescriptors:@[sort]] mutableCopy]);
failureBlock:^(NSError *error)
finished(@[]);
NSLog(@"Error loading images %@", error);
];
但是,我似乎没有获得所有资产,如果我从外部来源将图像添加到 iPhone,这些不会显示在从上述代码收到的资产列表中......我得到的似乎是其他一切。我怀疑这可能是框架的限制,但是当我使用 instagram 时,我注意到我的应用程序中缺少的照片是可见的......我如何让每种类型的资产“ALAssetsGroupAll”都不够?
【问题讨论】:
【参考方案1】:问题是您不了解enumerateAssetsUsingBlock:
的工作原理。 它是异步的。
要明白我的意思,让我用一些数字划分你的代码:
// (1)
[group enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop)
// (2)
if(result)
[tmpAssets addObject:result];
];
// (3)
NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"date" ascending:NO];
finished([[tmpAssets sortedArrayUsingDescriptors:@[sort]] mutableCopy]);
问题是 3 在 2 之前执行。因此,tmpAssets
中还没有任何内容。
那么你应该怎么做呢?嗯,这个方法(以及其他类似工作的 ALAssets 方法)以一种非常奇怪和特殊的方式运行:它们调用它们的块 一个额外的时间,并带有一个 nil 参数。 (您似乎已经意识到这一点,因为您正在执行 nil 测试;但您还没有理解其中的含义。)您的工作是测试 nil 参数。如果参数为 nil,这是最后的额外调用,现在您可以进行任何清理。所以,像这样:
// (1)
[group enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop)
// (2)
if(result)
[tmpAssets addObject:result];
else
// (3) // aha, finished, this is the extra time through
// NOW do something with tmpAssets!
];
【讨论】:
【参考方案2】:您似乎需要将所有组中的所有资产添加到单个数组中,而不是单独为组添加多个调用完成的块。
-(NSArray *)allAssets
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
NSMutableArray *allAssets = [@[] mutableCopy];
[[self defaultAssetsLibrary] enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop)
[group enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop)
if(result)
[tmpAssets addObject:result];
];
dispatch_semaphore_signal(semaphore);
failureBlock:^(NSError *error)
NSLog(@"Error loading images %@", error);
dispatch_semaphore_signal(semaphore);
];
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"date" ascending:NO];
return [tmpAssets sortedArrayUsingDescriptors:@[sort]];
【讨论】:
以上是关于AssetLibrary 不返回带有“ALAssetsGroupAll”的所有资产的主要内容,如果未能解决你的问题,请参考以下文章
使用 AssetLibrary 从 iPhone 获取最后 10 张照片,iOS 6.1.3 上的 Corelocation 弃用问题