您的位置:首页 > 移动开发 > IOS开发

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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: