我使用以下代码查询资产库
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”还不够?
答案 0 :(得分:0)
问题在于您不了解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,则这是最后的额外调用,现在您可以进行任何清理。所以,像这样:
// (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!
}
}];
答案 1 :(得分:-1)
您似乎需要将所有资源添加到所有组中的单个数组中,而不是单独添加到多个组中,并且多次调用已完成的块。
-(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]];
}