尝试访问元数据时并发 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 迭代死锁的主要内容,如果未能解决你的问题,请参考以下文章