Ios AssetLibrary不返回带有“的所有资产”;ALASSETGROUPALL“;

Ios AssetLibrary不返回带有“的所有资产”;ALASSETGROUPALL“;,ios,ios7,alassetlibrary,Ios,Ios7,Alassetlibrary,我使用以下代码查询资产库 ALAssetsLibrary *assetsLibrary = [self defaultAssetsLibrary]; [assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) { NSMutableArray *tmpAssets = [@[] mutableCopy]; [group enumera

我使用以下代码查询资产库

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时,我注意到我的应用程序中丢失的照片是可见的。。。如何获取每种类型的资产“AlassetGroupAll”还不够?

似乎需要将所有资产从所有组添加到一个数组中,而不是单独为组添加多个对完成块的调用

-(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]];
}

问题是您不了解
EnumerateAssetSingBlock:
的工作原理。它是异步的

为了理解我的意思,让我用一些数字来划分代码:

// (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
中还没有任何内容

那你该怎么办?这个方法(以及其他工作类似的方法)以一种非常奇怪和特殊的方式运行:它们用一个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!
    }
}];