iOS系统GCD学习(10):常见的错误
2014-03-21 19:13
344 查看
贴几段斯坦福大学关于gcd的代码,这段代码逐步演示了如何修正错误,其中用到的既是串行队列。
1。这个是原始代码
[cpp] view
plaincopy
- (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处
[cpp] view
plaincopy
- (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!
改正后如下:
[cpp] view
plaincopy
- (void)viewWillAppear:(BOOL)animated
{
dispatch_queue_t downloadQueue = dispatch_queue_create(“Flickr downloader”, NULL);
dispatch_async(downloadQueue, ^{
NSData *imageData = [FlickrFetcher imageDataForPhotoWithURLString:photo.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;
});
});
}
4。第二个错误,NSManagedObjectContext并不是线程安全的,gcd中访问成员变量有危险
Problem! NSManagedObjectContext is not thread safe,
so we can’t call photo.URL in downloadQueue’s t
改正后如下:
[cpp] view
plaincopy
- (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;
}); });
}
5。第三个错误,队列创建后没有释放,内存泄露
[cpp] view
plaincopy
- (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;
});
});
dispatch_release(downloadQueue);
1。这个是原始代码
[cpp] view
plaincopy
- (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处
[cpp] view
plaincopy
- (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!
改正后如下:
[cpp] view
plaincopy
- (void)viewWillAppear:(BOOL)animated
{
dispatch_queue_t downloadQueue = dispatch_queue_create(“Flickr downloader”, NULL);
dispatch_async(downloadQueue, ^{
NSData *imageData = [FlickrFetcher imageDataForPhotoWithURLString:photo.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;
});
});
}
4。第二个错误,NSManagedObjectContext并不是线程安全的,gcd中访问成员变量有危险
Problem! NSManagedObjectContext is not thread safe,
so we can’t call photo.URL in downloadQueue’s t
改正后如下:
[cpp] view
plaincopy
- (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;
}); });
}
5。第三个错误,队列创建后没有释放,内存泄露
[cpp] view
plaincopy
- (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;
});
});
dispatch_release(downloadQueue);
相关文章推荐
- iOS系统GCD学习(10):常见的错误
- iOS系统GCD学习(10):常见的错误
- iOS系统GCD学习(5):信号量机制
- iOS学习笔记10(1)—GCD介绍(一): 基本概念和Dispatch Queue
- iOS系统GCD学习(7):dispatch_once
- IOS学习之多线程(8)--GCD的常见用法
- 常见iOS系统错误代码含义 英文版
- iOS系统GCD学习(5):信号量机制
- iOS学习笔记10(2)—GCD介绍(二): 多核心的性能
- 黑马程序员---ios开发---objective-c学习-01-简单类实现常见错误及分析
- iOS系统GCD学习(1):介绍
- iOS系统GCD学习(2):Dispatch Queue
- iOS系统GCD学习(4):dispatch_group2
- iOS学习笔记10(3)—GCD介绍(三): Dispatch Sources
- iOS系统GCD学习(8):Dispatch Queue挂起恢复和目标指定
- ios 学习总结day01关于UIview和IBAction 常见错误
- iOS系统GCD学习(3):dispatch_group
- iOS学习笔记10(7)—GCD示例源码
- iOS系统GCD学习(9):多核心的性能
- iOS系统GCD学习(5):信号量机制