博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ios block一定会犯的几个错误
阅读量:6568 次
发布时间:2019-06-24

本文共 2887 字,大约阅读时间需要 9 分钟。

贴几段斯坦福大学关于gcd的代码,这段代码逐步演示了如何修正错误,其中用到的既是串行队列
 
1。这个是原始代码
  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处
  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!
改正后如下:
  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. }); }  
4。第二个错误,NSManagedObjectContext并不是线程安全的,gcd中访问成员变量有危险
Problem! NSManagedObjectContext is not thread safe,
so we can’t call photo.URL in downloadQueue’s t
改正后如下:
  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。第三个错误,队列创建后没有释放,内存泄露
  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. <span style="color:#ff0000;">dispatch_release(downloadQueue); //won’tactuallygoawayuntilqueueisemp

转载于:https://www.cnblogs.com/ios8/p/ios-mistake.html

你可能感兴趣的文章
luvit 被忽视的lua 高性能框架(仿nodejs)
查看>>
也许每个农村出来的码农都有个田园梦
查看>>
J2EE的13种核心技术
查看>>
Express.js 中的 Sessions 如何工作?(译)
查看>>
Web自动化之Headless Chrome概览
查看>>
【133天】尚学堂高淇Java300集视频精华笔记(71-72)
查看>>
剖析 Laravel 计划任务--事件属性
查看>>
百度成立国内首个深度学习教育联盟,将制定行业标准
查看>>
Micronaut教程:如何使用基于JVM的框架构建微服务
查看>>
检查IP是否可用的方法
查看>>
互联网架构师必备技术 Docker仓库与Java应用服务动态发布那些事
查看>>
Intellij IDEA 2018.2 搭建Spring Boot 应用
查看>>
作为数据科学家,我都有哪些弱点
查看>>
(转)线程安全的CopyOnWriteArrayList介绍
查看>>
中交兴路完成7亿元A轮融资,携手蚂蚁金服共建小微物流科技服务生态
查看>>
对LinqtoExcel的扩展 【数据有限性,逻辑有效性】
查看>>
WPF TreeView HierarchicalDataTemplate
查看>>
32岁老程序员的现状和尴尬,无奈中透露些许悲凉,有选择却更痛苦
查看>>
WPF MeshGeometry3D
查看>>
puppet cron 模块
查看>>