程序员人生 网站导航

Dispatch Group的使用

栏目:综合技术时间:2015-04-14 08:50:38

转自MJ偶像

Dispatch Group的使用

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

[java] view plaincopy
  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.   
  8. - (void)downloadImages {  
  9.     // 异步下载图片  
  10.     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{  
  11.         // 下载第1张图片  
  12.         NSString *url1 = @"http://car0.autoimg.cn/upload/spec/9579/u_20120110174805627264.jpg";  
  13.         UIImage *image1 = [self imageWithURLString:url1];  
  14.           
  15.         // 下载第2张图片  
  16.         NSString *url2 = @"http://hiphotos.baidu.com/lvpics/pic/item/3a86813d1fa41768bba16746.jpg";  
  17.         UIImage *image2 = [self imageWithURLString:url2];  
  18.           
  19.         // 回到主线程显示图片  
  20.         dispatch_async(dispatch_get_main_queue(), ^{  
  21.             self.imageView1.image = image1;  
  22.               
  23.             self.imageView2.image = image2;  
  24.         });  
  25.     });  
  26. }  
虽然这类方案可以解决问题,但其实两张图片的下载进程其实不需要按顺序履行,并发履行它们可以提高履行速度。有个注意点就是必须等两张图片都下载终了后才能回到主线程显示图片。Dispatch Group能够在这类情况下帮我们提升性能。下面先看看Dispatch Group的用途:

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

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

[java] view plaincopy
  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.   
  9. - (void)downloadImages {  
  10.     dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);  
  11.       
  12.     // 异步下载图片  
  13.     dispatch_async(queue, ^{  
  14.         // 创建1个组  
  15.         dispatch_group_t group = dispatch_group_create();  
  16.           
  17.         __block UIImage *image1 = nil;  
  18.         __block UIImage *image2 = nil;  
  19.           
  20.         // 关联1个任务到group  
  21.         dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{  
  22.             // 下载第1张图片  
  23.             NSString *url1 = @"http://car0.autoimg.cn/upload/spec/9579/u_20120110174805627264.jpg";  
  24.             image1 = [self imageWithURLString:url1];  
  25.         });  
  26.           
  27.         // 关联1个任务到group  
  28.         dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{  
  29.             // 下载第1张图片  
  30.             NSString *url2 = @"http://hiphotos.baidu.com/lvpics/pic/item/3a86813d1fa41768bba16746.jpg";  
  31.             image2 = [self imageWithURLString:url2];  
  32.         });  
  33.           
  34.         // 等待组中的任务履行终了,回到主线程履行block回调  
  35.         dispatch_group_notify(group, dispatch_get_main_queue(), ^{  
  36.             self.imageView1.image = image1;  
  37.             self.imageView2.image = image2;  
  38.               
  39.             // 千万不要在异步线程中自动释放UIImage,由于当异步线程结束,异步线程的自动释放池也会被烧毁,那末UIImage也会被烧毁  
  40.               
  41.             // 在这里释放图片资源  
  42.             [image1 release];  
  43.             [image2 release];  
  44.         });  
  45.           
  46.         // 释放group  
  47.         dispatch_release(group);  
  48.     });  
  49. }  
------分隔线----------------------------
------分隔线----------------------------

最新技术推荐