1

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

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”都不够?

4

2 回答 2

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 测试;但您还没有理解其中的含义。)您的工作是测试 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!
    }
}];
于 2014-05-28T03:08:47.097 回答
-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]];
}
于 2014-05-28T02:20:20.927 回答