我有一个图像加载器类,它提供了来自网络的 NSURL 加载和图像并执行完成块。代码其实很简单
- (void)downloadImageWithURL:(NSString *)URLString completion:(BELoadImageCompletionBlock)completion
{
dispatch_async(_queue, ^{
// dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
UIImage *image = nil;
NSURL *URL = [NSURL URLWithString:URLString];
if (URL) {
image = [UIImage imageWithData:[NSData dataWithContentsOfURL:URL]];
}
dispatch_async(dispatch_get_main_queue(), ^{
completion(image, URLString);
});
});
}
当我更换
dispatch_async(_queue, ^{
注释掉
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
图像加载速度更快,这是非常合乎逻辑的(在图像一次加载一个之前,现在一堆同时加载)。我的问题是我可能有 50 张图片,我为所有图片调用了 downloadImageWithURL:completion: 方法,当我使用全局队列而不是 _queue 时,我的应用程序最终崩溃,我看到有 85 个以上的线程。问题可能是我连续 50 次调用 dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0) 会使 GCD 创建太多线程吗?我认为 gcd 处理所有的线程并确保线程数不是很大,但如果不是这样,有什么办法可以影响线程数吗?