iOS系统GCD学习(10):常见的错误

贴几段斯坦福大学关于 gcd的代码,这段代码逐步演示了如何修正错误,其中用到的既是串行队列。
  1。这个是原始代码
[cpp] view plain copy
  1. - (void)viewWillAppear:(BOOL)animated   
  2. {   
  3.     NSData *imageData = [FlickrFetcher imageDataForPhotoWithURLString:photo.URL];   
  4.     UIImage *image = [UIImage imageWithData:imageData];   
  5.     self.imageView.image = image;   
  6.     self.imageView.frame = CGRectMake(0, 0, image.size.width, image.size.height);   
  7.     self.scrollView.contentSize = image.size;   
  8. }   


  2。这个是采用gcdd的代码,里面有错误3处

[cpp] view plain copy
  1. - (void)viewWillAppear:(BOOL)animated   
  2. {   
  3.     dispatch_queue_t downloadQueue = dispatch_queue_create(“Flickr downloader”, NULL);   
  4.     dispatch_async(downloadQueue, ^{   
  5.          NSData *imageData = [FlickrFetcher imageDataForPhotoWithURLString:photo.URL];   
  6.          UIImage *image = [UIImage imageWithData:imageData];   
  7.          self.imageView.image = image;   
  8.          self.imageView.frame = CGRectMake(0, 0, image.size.width, image.size.height);   
  9.          self.scrollView.contentSize = image.size;   
  10.     });   
  11. }   

  3。第一个错误,UI更新只能在主线程中 Problem! UIKit calls can only happen in the main thread!
改正后如下:

[cpp] view plain copy
  1. - (void)viewWillAppear:(BOOL)animated   
  2. {   
  3.     dispatch_queue_t downloadQueue = dispatch_queue_create(“Flickr downloader”, NULL);   
  4.     dispatch_async(downloadQueue, ^{   
  5.          NSData *imageData = [FlickrFetcher imageDataForPhotoWithURLString:photo.URL];   
  6.          <SPAN style="COLOR: #ff0000">dispatch_async(dispatch_get_main_queue(), ^{</SPAN>   
  7.              UIImage *image = [UIImage imageWithData:imageData];   
  8.              self.imageView.image = image;   
  9.              self.imageView.frame = CGRectMake(0, 0, image.size.width, image.size.height);   
  10.              self.scrollView.contentSize = image.size;   
  11.          });   
  12. });    
  13. }   

  4。第二个错误,NSManagedObjectContext并不是线程安全的,gcd中访问成员变量有危险
Problem! NSManagedObjectContext is not thread safe,
so we can’t call photo.URL in downloadQueue’s t

  改正后如下:

[cpp] view plain copy
  1. - (void)viewWillAppear:(BOOL)animated   
  2. {   
  3.   <SPAN style="COLOR: #ff0000">  NSString *url = photo.URL;</SPAN>   
  4.     dispatch_queue_t downloadQueue = dispatch_queue_create(“Flickr downloader”, NULL);   
  5.     dispatch_async(downloadQueue, ^{   
  6.         NSData *imageData = [FlickrFetcher <SPAN style="COLOR: #ff0000">imageDataForPhotoWithURLString:url];</SPAN>   
  7.         dispatch_async(dispatch_get_main_queue(), ^{   
  8.             UIImage *image = [UIImage imageWithData:imageData];   
  9.             self.imageView.image = image;   
  10.             self.imageView.frame = CGRectMake(0, 0, image.size.width, image.size.height);   
  11.             self.scrollView.contentSize = image.size;   
  12. }); });   
  13. }   

  5。第三个错误,队列创建后没有释放,内存泄露

[cpp] view plain copy
  1. - (void)viewWillAppear:(BOOL)animated   
  2. {   
  3.     NSString *url = photo.URL;   
  4.     dispatch_queue_t downloadQueue = dispatch_queue_create(“Flickr downloader”, NULL);   
  5.     dispatch_async(downloadQueue, ^{   
  6.         NSData *imageData = [FlickrFetcher imageDataForPhotoWithURLString:url];   
  7.         dispatch_async(dispatch_get_main_queue(), ^{   
  8.             UIImage *image = [UIImage imageWithData:imageData];   
  9.             self.imageView.image = image;   
  10.             self.imageView.frame = CGRectMake(0, 0, image.size.width, image.size.height);   
  11.             self.scrollView.contentSize = image.size;   
  12. });    
  13. }); 

你可能感兴趣的:(iOS系统GCD学习(10):常见的错误)