当尝试迭代图像资源时,尽管将元数据访问并行化可能是一个有趣的想法,因为它非常耗时。结果是某种死锁中的多线程。代码:
[_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
时)所有任务都被卡住了。
有什么想法吗?
答案 0 :(得分:0)
我猜它已经超出了范围。我假设的主要罪魁祸首是资产库本身超出范围。