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

Posted

技术标签:

【中文标题】尝试访问元数据时并发 ALAssetsLibrary 迭代死锁【英文标题】:Concurrent ALAssetsLibrary iteration deadlock when trying to access metadata 【发布时间】: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 时)所有任务都卡住了。

有什么想法吗?

【问题讨论】:

【参考方案1】:

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

【讨论】:

_assetsLibrary 是成员,并且类实例没有超出范围。

以上是关于尝试访问元数据时并发 ALAssetsLibrary 迭代死锁的主要内容,如果未能解决你的问题,请参考以下文章

在 Stripe Customer 对象 C# 中访问元数据时遇到问题

将 SSAS 元数据导入 OBIEE 时访问被拒绝

MySQL metadata lock

无法访问 IIS 元数据库 ASP.Net

无法访问 IIS 元数据库 ASP.Net

我尝试访问元组值,但它说在尝试在 Python 中创建保存/加载方法时解包的值太多