• ios block一定会犯的几个错误


    贴几段斯坦福大学关于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
  • 相关阅读:
    java执行shell命令,chmod 777 xxx,改变权限无效的解决办法。
    SpringBoot配置双数据源(一个项目同时连接操作两台数据库)
    《机器学习》周志华西瓜书习题参考答案:第2章
    《机器学习》周志华西瓜书学习笔记(二):模型评估与选择
    只用一套解决方案,就可解决80%的交通物流行业信息难题
    原码、反码、补码
    400+节点的Elasticsearch集群运维
    史上最全PostgreSQL体系结构
    IDEA创建JAVAFX并打包成exe
    DB2 Zos 浅谈
  • 原文地址:https://www.cnblogs.com/ios8/p/ios-mistake.html
Copyright © 2020-2023  润新知