【问题标题】:Concurrent ALAssetsLibrary iteration deadlock when trying to access metadata尝试访问元数据时并发 ALAssetsLibrary 迭代死锁
【发布时间】:2014-07-08 16:46:36
【问题描述】:

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

[_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 时)所有任务都卡住了。

有什么想法吗?

【问题讨论】:

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


    【解决方案1】:

    我猜它超出了范围。我认为的罪魁祸首是资产库本身超出了两者之间的范围。

    【讨论】:

    • _assetsLibrary 是成员,并且类实例没有超出范围。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-05
    • 1970-01-01
    • 2019-10-18
    相关资源
    最近更新 更多