【发布时间】: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