GCD的顺序下载

来源:互联网 发布:联想e41指纹识别软件 编辑:程序博客网 时间:2024/05/21 17:29

 在实际的项目开发中,我们往往需要从网络加载图片资源,为了不影响主线程,我们需要开辟新的线程。同时为了控制不同线程之间的前后顺序,需要引入信号量机制。这里我们来实现一个案例:从网络加载3张图片,当加载完第一张后在加载第二张,然后再加载第三张。

(1)首先也需要引入GCD的源代码,然后在ViewController代码中实现如下:

[objc] view plaincopyprint?
  1. #import "ViewController.h"  
  2. #import "GCD.h"  
  3.   
  4. @interface ViewController ()  
  5.   
  6. @property(strong,nonatomicUIImageView *view1;  
  7. @property(strong,nonatomicUIImageView *view2;  
  8. @property(strong,nonatomicUIImageView *view3;  
  9.   
  10. @end  
  11.   
  12. @implementation ViewController  
  13.   
  14. - (void)viewDidLoad {  
  15.   [super viewDidLoad];  
  16.     
  17.     
  18.   self.view1 = [self setImageViewFrame:CGRectMake(00300200)];  
  19.   self.view2 = [self setImageViewFrame:CGRectMake(0200300200)];  
  20.   self.view3 = [self setImageViewFrame:CGRectMake(0400300200)];  
  21.     
  22.   NSString *url01 = @"http://pic17.nipic.com/20111026/8662498_125925242183_2.jpg";  
  23.   NSString *url02 = @"http://b.hiphotos.baidu.com/zhidao/wh%3D450%2C600/sign=53da5874352ac65c67506e77cec29e27/9f2f070828381f30807909bda9014c086e06f046.jpg";  
  24.   NSString *url03 = @"http://cimg.163.com/sport/0412/23/wu2305.jpg";  
  25.     
  26.     
  27.   GCDSemaphore *semaphore = [[GCDSemaphore alloc] init];  
  28.   GCDSemaphore *semaphore2 = [[GCDSemaphore alloc] init];  
  29.     
  30.   //开启三个异步线程;  
  31.     
  32.   [GCDQueue executeInGlobalQueue:^{  
  33.       
  34.     UIImage *image01 = [self accessDataByNetwork:url01];  
  35.       
  36.     [GCDQueue executeInMainQueue:^{  
  37.         
  38.       [UIView animateWithDuration:2.0f  
  39.                        animations:^{  
  40.                          self.view1.image = image01;  
  41.                          [self.view1 setAlpha:1.0f];  
  42.                            
  43.                        } completion:^(BOOL finished) {  
  44.                            
  45.                          //通知第1个信号量;  
  46.                          [semaphore signal];  
  47.                        }];  
  48.         
  49.     }];  
  50.       
  51.   }];  
  52.     
  53.     
  54.   [GCDQueue executeInGlobalQueue:^{  
  55.       
  56.     UIImage *image02 = [self accessDataByNetwork:url02];  
  57.       
  58.     //第1个信号量等待;  
  59.     [semaphore wait];  
  60.       
  61.     [GCDQueue executeInMainQueue:^{  
  62.         
  63.       [UIView animateWithDuration:2.0f  
  64.                        animations:^{  
  65.                          self.view2.image = image02;  
  66.                          [self.view2 setAlpha:1.0f];  
  67.                            
  68.                        } completion:^(BOOL finished) {  
  69.                            
  70.                          //通知第2个信号量;  
  71.                          [semaphore2 signal];  
  72.                        }];  
  73.         
  74.     }];  
  75.       
  76.   }];  
  77.     
  78.     
  79.     
  80.   [GCDQueue executeInGlobalQueue:^{  
  81.       
  82.     UIImage *image03 = [self accessDataByNetwork:url03];  
  83.       
  84.     //第2个信号量等待;  
  85.     [semaphore2 wait];  
  86.       
  87.     [GCDQueue executeInMainQueue:^{  
  88.         
  89.       [UIView animateWithDuration:2.0f  
  90.                        animations:^{  
  91.                          self.view3.image = image03;  
  92.                          [self.view3 setAlpha:1.0f];  
  93.                            
  94.                        } completion:^(BOOL finished) {  
  95.                            
  96.                        }];  
  97.         
  98.     }];  
  99.       
  100.   }];  
  101.     
  102. }  
  103.   
  104.   
  105. //设置图片大小位置和透明度;alpha = 0表示完全透明;  
  106. - (UIImageView *)setImageViewFrame:(CGRect)frame{  
  107.     
  108.   UIImageView *imageView = [[UIImageView alloc] initWithFrame:frame];  
  109.   imageView.alpha = 0.f;  
  110.   [self.view addSubview:imageView];  
  111.     
  112.   return imageView;  
  113.     
  114. }  
  115.   
  116.   
  117. //进行网络请求;  
  118. - (UIImage *)accessDataByNetwork:(NSString *)string{  
  119.     
  120.   NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:string]];  
  121.   NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];  
  122.     
  123.   return [UIImage imageWithData:data];  
  124.     
  125. }  
  126.   
  127.   
  128.   
  129.   
  130. @end  
0 0
原创粉丝点击