iOS系统GCD学习(10):常见的错误
2013-01-09 23:03
405 查看
贴几段斯坦福大学关于gcd的代码,这段代码逐步演示了如何修正错误,其中用到的既是串行队列。
1。这个是原始代码
2。这个是采用gcdd的代码,里面有错误3处
3。第一个错误,UI更新只能在主线程中 Problem! UIKit calls can only happen in the main thread!
改正后如下:
4。第二个错误,NSManagedObjectContext并不是线程安全的,gcd中访问成员变量有危险
Problem! NSManagedObjectContext is not thread safe,
so we can’t call photo.URL in downloadQueue’s t
改正后如下:
5。第三个错误,队列创建后没有释放,内存泄露
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
改正后如下:
- (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; }); }); }
5。第三个错误,队列创建后没有释放,内存泄露
- (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; }); });
相关文章推荐
- iOS系统GCD学习(10):常见的错误
- iOS系统GCD学习(10):常见的错误
- iOS系统GCD学习(6):Dispatch Sources
- iOS学习笔记10(7)—GCD示例源码
- iOS系统GCD学习(8):Dispatch Queue挂起恢复和目标指定
- iOS学习笔记10(7)—GCD示例源码
- iOS 学习笔记 六 (2015.03.28)常见错误
- iOS系统GCD学习(9):多核心的性能
- iOS系统GCD学习(12):IO资源竞争
- iOS学习笔记10(1)—GCD介绍(一): 基本概念和Dispatch Queue
- 深入理解计算机系统学习笔记(三)之C语言常见的与存储器(内存)有关的错误
- iOS系统GCD学习(7):dispatch_once
- iOS系统GCD学习(5):信号量机制
- iOS学习笔记10(2)—GCD介绍(二): 多核心的性能
- IOS学习之多线程(8)--GCD的常见用法
- iOS学习笔记10(3)—GCD介绍(三): Dispatch Sources
- 黑马程序员---ios开发---objective-c学习-01-简单类实现常见错误及分析
- iOS系统GCD学习(8):Dispatch Queue挂起恢复和目标指定
- 常见iOS系统错误代码含义 英文版
- iOS系统GCD学习(5):信号量机制