尝试访问元数据时,并发ALAssetsLibrary迭代死锁

时间:2014-07-08 16:46:36

标签: ios objective-c concurrency grand-central-dispatch alassetslibrary

当尝试迭代图像资源时,尽管将元数据访问并行化可能是一个有趣的想法,因为它非常耗时。结果是某种死锁中的多线程。代码:

[_assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupLibrary usingBlock:^(ALAssetsGroup *group, BOOL *stop) {

    if (group) {
        [group setAssetsFilter:[ALAssetsFilter allPhotos]];
        [group enumerateAssetsUsingBlock:^(ALAsset *asset, NSUInteger index, BOOL *stop) {
            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
                if (asset) {
                    NSLog(@"%d", index);
                    id s = asset.defaultRepresentation.metadata; // <----- This is the troublemaker
                }
            });
        }];
    }
} failureBlock:nil];

部分任务已完成但其他任务仍然存在。当我暂停执行并检查线程时,我发现[ALAssetRepresentation metadata]正在等待多个线程上的某个信号量信号。

其他时候(当我删除NSLog时)所有任务都被卡住了。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我猜它已经超出了范围。我假设的主要罪魁祸首是资产库本身超出范围。