dar*_*iaa 5 multithreading grand-central-dispatch ios
我有一个图像加载器类,它提供NSURL加载和来自Web的图像并执行完成块.代码实际上非常简单
- (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);
});
});
Run Code Online (Sandbox Code Playgroud)
}
当我更换
dispatch_async(_queue, ^{
Run Code Online (Sandbox Code Playgroud)
注释掉了
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
Run Code Online (Sandbox Code Playgroud)
图像的加载速度要快得多,这是非常合乎逻辑的(在此之前,图像将一次加载一个,现在一堆图像同时加载).我的问题是我可能有50个图像,我为所有这些调用downloadImageWithURL:completion:方法,当我使用全局队列而不是_queue时,我的应用程序最终崩溃,我看到有85个以上的线程.可能问题是我连续50次调用dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0)会让GCD创建太多线程吗?我认为gcd处理所有的treading并确保线程的数量不是很大,但如果不是这样的话,我有什么方法可以影响线程的数量?
当全局并发队列的现有GCD工作线程上的工作单元在内核中被阻塞很长时间时(只要全局队列上还有待处理的工作),内核就会创建其他线程.
这是必要的,以便应用程序可以继续总体上取得进展(例如,挂起的块之一的执行可以是允许被阻塞的线程被解除阻塞的内容).
如果在内核中阻塞工作线程的原因是IO(例如+[NSData dataWithContentsOfURL:]在本例中),那么最好的解决方案是使用API来替换这些调用,这些API将异步执行该IO而不会阻塞,例如NSURLConnection用于网络或调度I/O文件系统IO.
或者,您可以手动限制并发阻塞操作的数量,例如,通过使用计数调度信号量.
在WWDC 2012 GCD会议去了这个话题在一些细节上.
并发队列(也称为全局调度队列的一种)同时执行一个或多个任务,但任务仍按照添加到队列的顺序启动。当前正在执行的任务在由调度队列管理的不同线程上运行。在任何给定点执行的任务的确切数量是可变的,并且取决于系统条件。
和
串行队列(也称为私有调度队列)按照任务添加到队列的顺序一次执行一个任务。当前正在执行的任务在由调度队列管理的不同线程上运行(该线程可能因任务而异)。
通过将所有块分派到高优先级并发分派队列
[NSData dataWithContentsOfURL:URL]
Run Code Online (Sandbox Code Playgroud)
这是一个同步阻塞网络操作,看起来默认的 GCD 行为将生成大量线程来尽快执行您的块。
您应该发送至DISPATCH_QUEUE_PRIORITY_BACKGROUND. 这些任务绝不是“高优先级”。任何图像处理都应该在有空闲时间并且主线程上没有发生任何事情的情况下进行。
如果您想更好地控制同时发生的这些事情的数量,我建议您考虑使用NSOperation. 您可以使用您的块并将它们嵌入到操作中NSBlockOperation,然后您可以将这些操作提交给您自己的NSOperationQueue。作为一个NSOperationQueue额外- (NSInteger)maxConcurrentOperationCount的好处,如果需要的话,操作也可以在调度后取消。
| 归档时间: |
|
| 查看次数: |
4673 次 |
| 最近记录: |