Dispatch Group的使用

转自MJ偶像

Dispatch Group的使用

假设有这样一个需求:从网络上下载两张不同的图片,然后显示到不同的UIImageView上去,一般可以这样实现

[java] view
plain
copy

  1. // 根据url获取UIImage
  2. - (UIImage *)imageWithURLString:(NSString *)urlString {
  3. NSURL *url = [NSURL URLWithString:urlString];
  4. NSData *data = [NSData dataWithContentsOfURL:url];
  5. return [UIImage imageWithData:data];
  6. }
  7. - (void)downloadImages {
  8. // 异步下载图片
  9. dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
  10. // 下载第一张图片
  11. NSString *url1 = @"http://car0.autoimg.cn/upload/spec/9579/u_20120110174805627264.jpg";
  12. UIImage *image1 = [self imageWithURLString:url1];
  13. // 下载第二张图片
  14. NSString *url2 = @"http://hiphotos.baidu.com/lvpics/pic/item/3a86813d1fa41768bba16746.jpg";
  15. UIImage *image2 = [self imageWithURLString:url2];
  16. // 回到主线程显示图片
  17. dispatch_async(dispatch_get_main_queue(), ^{
  18. self.imageView1.image = image1;
  19. self.imageView2.image = image2;
  20. });
  21. });
  22. }

虽然这种方案可以解决问题,但其实两张图片的下载过程并不需要按顺序执行,并发执行它们可以提高执行速度。有个注意点就是必须等两张图片都下载完毕后才能回到主线程显示图片。Dispatch Group能够在这种情况下帮我们提升性能。下面先看看Dispatch
Group的用处:

我们可以使用dispatch_group_async函数将多个任务关联到一个Dispatch Group和相应的queue中,group会并发地同时执行这些任务。而且Dispatch Group可以用来阻塞一个线程, 直到group关联的所有的任务完成执行。有时候你必须等待任务完成的结果,然后才能继续后面的处理。

下面用Dispatch Group优化上面的代码:

[java] view
plain
copy

  1. // 根据url获取UIImage
  2. - (UIImage *)imageWithURLString:(NSString *)urlString {
  3. NSURL *url = [NSURL URLWithString:urlString];
  4. NSData *data = [NSData dataWithContentsOfURL:url];
  5. // 这里并没有自动释放UIImage对象
  6. return [[UIImage alloc] initWithData:data];
  7. }
  8. - (void)downloadImages {
  9. dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
  10. // 异步下载图片
  11. dispatch_async(queue, ^{
  12. // 创建一个组
  13. dispatch_group_t group = dispatch_group_create();
  14. __block UIImage *image1 = nil;
  15. __block UIImage *image2 = nil;
  16. // 关联一个任务到group
  17. dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
  18. // 下载第一张图片
  19. NSString *url1 = @"http://car0.autoimg.cn/upload/spec/9579/u_20120110174805627264.jpg";
  20. image1 = [self imageWithURLString:url1];
  21. });
  22. // 关联一个任务到group
  23. dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
  24. // 下载第一张图片
  25. NSString *url2 = @"http://hiphotos.baidu.com/lvpics/pic/item/3a86813d1fa41768bba16746.jpg";
  26. image2 = [self imageWithURLString:url2];
  27. });
  28. // 等待组中的任务执行完毕,回到主线程执行block回调
  29. dispatch_group_notify(group, dispatch_get_main_queue(), ^{
  30. self.imageView1.image = image1;
  31. self.imageView2.image = image2;
  32. // 千万不要在异步线程中自动释放UIImage,因为当异步线程结束,异步线程的自动释放池也会被销毁,那么UIImage也会被销毁
  33. // 在这里释放图片资源
  34. [image1 release];
  35. [image2 release];
  36. });
  37. // 释放group
  38. dispatch_release(group);
  39. });
  40. }
时间: 2024-08-24 22:02:55

Dispatch Group的使用的相关文章

iOS 8:Dispatch Group一点补充

这是一篇博文的评论部分,特意摘取,博文地址:http://blog.cnbang.net/tech/2320/ Dispatch Group 会在整个组的任务都完成时通知你.这些任务可以是同步的,也可以是异步的,即便在不同的队列也行.而且在整个组的任务都完成时,Dispatch Group 可以用同步的或者异步的方式通知你.因为要监控的任务在不同队列,那就用一个 dispatch_group_t 的实例来记下这些不同的任务. 另外,需要在整组任务完成时通知也可用batchOfRequest.

通过Dispatch Group机制,根据系统资源状况来执行任务

dispatch group是GCD的一项特性,能够把任务分组,调用者可以等待这组任务执行完毕,也可以在提供回调函数之后继续往下执行,这组任务完成时,调用者会得到通知. 这个功能有多个用途,其中最重要,最值得注意的用法,就是把将要并发执行的多个任务合为一个组,于是调用者就可以知道这些任务合适才能全部执行完毕. 举个栗子:把一系列压缩文件的任务表示成dispatch group. 下面这个函数可以创建dispatch group: dispatch_group_tdispatch_group_cr

dispatch group使用方法详解

第一.dispatch group可以用来将多个block组成一组以监测这些Block全部完成或者等待全部完成时发出的消息.使用函数dispatch_group_create来创建,然后使用函数dispatch_group_async来将block提交至一个dispatch queue,同时将它们添加至一个组.使用dispatch_group_notify,增加监听,当group内的block全部执行完时,再执行该函数指定的block dispatch_queue_t queue=dispatc

[编写高质量iOS代码的52个有效方法](十)Grand Central Dispatch(GCD)

[编写高质量iOS代码的52个有效方法](十)Grand Central Dispatch(GCD) 参考书籍:<Effective Objective-C 2.0> [英] Matt Galloway 先睹为快 41.多用派发队列,少用同步锁 42.多用GCD,少用performSelector系列方法 43.掌握GCD及操作队列的使用时机 44.通过Dispatch Group机制,根据系统资源状况来执行任务 45.使用dispatch_once来执行只需要运行一次的线程安全代码 46.不

iOS开发-多线程之GCD(Grand Central Dispatch)

Grand Central Dispatch(GCD)是一个强有力的方式取执行多线程任务,不管你在回调的时候是异步或者同步的,可以优化应用程序支持多核心处理器和其他的对称多处理系统的系统.开发使用的过程中只需要将执行的任务并添加到到适当的Dispatch Queue中,GCD就能生成必要的线程并计划执行任务.Dispatch Queue更简单而且在实现符合需求的多线程任务时更有效率.Dispatch  Queue一般来说有三种方式,如下图: Serial执行的时候的先进先出,Concurrent

Grand Central Dispatch (GCD) 转

GCD是异步执行任务的技术之一. GCD使用很简洁的记述方法,实现了极为复杂繁琐的多线程编程. dispatch_async(queue, ^{ //长时间处理 //例如AR用动画识别 //例如数据库访问 //长时间处理结束,主线程使用该处理结果 dispatch_async( dispatch_get_main_queue(), ^{ //只在主线程可以执行的处理 //例如用户界面更新 }); }); 在NSObject中,提供了两个实例方法来实现简单的多线程技术:performSelecto

Dispatch Queues调度队列

前言-死锁案例 // 在主线程中执行 dispatch_queue_t queueMain = dispatch_get_main_queue(); dispatch_sync(queueMain, ^{ NSLog(@"+++++++"); }); NSLog(@"hahahaha"); 案例分析:运行结果是程序阻塞在dispatch_sync()处.由于main线程执行到dispatch_sync()处,线程处于等待状态.将block任务块添加到主串行队列最后,

iOS 并行编程:GCD Dispatch Queues

1 简介 1.1 功能       Grand Central Dispatch(GCD)技术让任务并行排队执行,根据可用的处理资源,安排他们在任何可用的处理器核心上执行任务.任务可以是一个函数(function)或者是一个block. GCD的底层依然是用线程实现,不过这样可以让程序员不用关注实现的细节. GCD中的队列称为dispatch queue,它可以保证先进来的任务先得到执行通过它能够大大简化多线程编程.工程师只要将要执行的任务(执行代码块)放入队列中,GCD将会为需要执行的任务创建

Swift - 多线程实现方式 - Grand Central Dispatch(GCD)

1,Swift继续使用Object-C原有的一套线程,包括三种多线程编程技术:(1)Thread(2)Cocoa Operation(Operation和OperationQueue)(3)Grand Central Dispath(GCD) 2,本文着重介绍Grand Central Dispath(GCD) GCD是Apple开发的一个多核编程的解决方法,基本概念就是dispatch queue(调度队列),queue是一个对象,它可以接受任务,并将任务以先到先执行的顺序来执行.dispat