贴几段斯坦福大学关于gcd的代码,这段代码逐步演示了如何修正错误,其中用到的既是串行队列
1。这个是原始代码
- - (void)viewWillAppear:(BOOL)animated
- {
- NSData *imageData = [FlickrFetcher imageDataForPhotoWithURLString:photo.URL];
- UIImage *image = [UIImage imageWithData:imageData];
- self.imageView.image = image;
- self.imageView.frame = CGRectMake(0, 0, image.size.width, image.size.height);
- self.scrollView.contentSize = image.size;
- }
2。这个是采用gcdd的代码,里面有错误3处
- - (void)viewWillAppear:(BOOL)animated
- {
- dispatch_queue_t downloadQueue = dispatch_queue_create(“Flickr downloader”, NULL);
- dispatch_async(downloadQueue, ^{
- NSData *imageData = [FlickrFetcher imageDataForPhotoWithURLString:photo.URL];
- UIImage *image = [UIImage imageWithData:imageData];
- self.imageView.image = image;
- self.imageView.frame = CGRectMake(0, 0, image.size.width, image.size.height);
- self.scrollView.contentSize = image.size;
- });
- }
3。第一个错误,UI更新只能在主线程中 Problem! UIKit calls can only happen in the main thread!
改正后如下:
- - (void)viewWillAppear:(BOOL)animated
- {
- dispatch_queue_t downloadQueue = dispatch_queue_create(“Flickr downloader”, NULL);
- dispatch_async(downloadQueue, ^{
- NSData *imageData = [FlickrFetcher imageDataForPhotoWithURLString:photo.URL];
- <span style="color:#ff0000;">dispatch_async(dispatch_get_main_queue(), ^{</span>
- UIImage *image = [UIImage imageWithData:imageData];
- self.imageView.image = image;
- self.imageView.frame = CGRectMake(0, 0, image.size.width, image.size.height);
-  self.scrollView.contentSize = image.size;
- });
- }); }
4。第二个错误,NSManagedObjectContext并不是线程安全的,gcd中访问成员变量有危险
Problem! NSManagedObjectContext is not thread safe,
so we can’t call photo.URL in downloadQueue’s t
so we can’t call photo.URL in downloadQueue’s t
改正后如下:
- - (void)viewWillAppear:(BOOL)animated
- {
- <span style="color:#ff0000;"> NSString *url = photo.URL;</span>
- dispatch_queue_t downloadQueue = dispatch_queue_create(“Flickr downloader”, NULL);
- dispatch_async(downloadQueue, ^{
- NSData *imageData = [FlickrFetcher <span style="color:#ff0000;">imageDataForPhotoWithURLString:url];</span>
- dispatch_async(dispatch_get_main_queue(), ^{
- UIImage *image = [UIImage imageWithData:imageData];
- self.imageView.image = image;
- self.imageView.frame = CGRectMake(0, 0, image.size.width, image.size.height);
- self.scrollView.contentSize = image.size;
- }); });
- }
- - (void)viewWillAppear:(BOOL)animated
- {
- NSString *url = photo.URL;
- dispatch_queue_t downloadQueue = dispatch_queue_create(“Flickr downloader”, NULL);
- dispatch_async(downloadQueue, ^{
- NSData *imageData = [FlickrFetcher imageDataForPhotoWithURLString:url];
- dispatch_async(dispatch_get_main_queue(), ^{
- UIImage *image = [UIImage imageWithData:imageData];
- self.imageView.image = image;
- self.imageView.frame = CGRectMake(0, 0, image.size.width, image.size.height);
- self.scrollView.contentSize = image.size;
- }); });
- <span style="color:#ff0000;">dispatch_release(downloadQueue); //won’tactuallygoawayuntilqueueisemp