贴几段斯坦福大学关于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

ios block一定会犯的几个错误的更多相关文章

  1. iOS block 机制

    本文要将block的以下机制,并配合具体代码详细描述: block 与 外部变量 block 的存储域:栈块.堆块.全局块 定义 块与函数类似,只不过是直接定义在另一个函数里,和定义它的那个函数共享同 ...

  2. iOS Block的本质(二)

    iOS Block的本质(二) 1. 介绍引入block本质 通过上一篇文章Block的本质(一)已经基本对block的底层结构有了基本的认识,block的底层就是__main_block_impl_ ...

  3. iOS Block界面反向传值

    在上篇博客 <iOS Block简介> 中,侧重解析了 iOS Block的概念等,本文将侧重于它们在开发中的应用. Block是iOS4.0+ 和Mac OS X 10.6+ 引进的对C ...

  4. iOS block从零开始

    iOS block从零开始 在iOS4.0之后,block横空出世,它本身封装了一段代码并将这段代码当做变量,通过block()的方式进行回调. block的结构 先来一段简单的代码看看: void ...

  5. ios Block详细用法

    ios Block详细用法 ios4.0系统已开始支持block,在编程过程中,blocks被Obj-C看成是对象,它封装了一段代码,这段代码可以在任何时候执行.Blocks可以作为函数参数或者函数的 ...

  6. iOS Block的本质(四)

    iOS Block的本质(四) 上一篇文章iOS Block的本质(三)中已经介绍过block变量的捕获,本文继续探寻block的本质. 1. block内修改变量的值 int main(int ar ...

  7. # iOS Block的本质(三)

    iOS Block的本质(三) 上一篇文章iOS Block的本质(二)中已经介绍过block变量的捕获,本文继续探寻block的本质. 1. block对对象变量的捕获,ARC 环境 block一般 ...

  8. iOS Block的本质(一)

    iOS Block的本质(一) 1.对block有一个基本的认识 block本质上也是一个oc对象,他内部也有一个isa指针.block是封装了函数调用以及函数调用环境的OC对象. 2.探寻block ...

  9. (译)IOS block编程指南 1 介绍

    Introduction(介绍) Block objects are a C-level syntactic and runtime feature. They are similar to stan ...

随机推荐

  1. LeetCode 225 Implement Stack using Queues(用队列来实现栈)(*)

    翻译 用队列来实现栈的例如以下操作. push(x) -- 将元素x加入进栈 pop() -- 从栈顶移除元素 top() -- 返回栈顶元素 empty() -- 返回栈是否为空 注意: 你必须使用 ...

  2. 【DB2】索引

    1. 索引的概念 1.1 索引的优点 索引是表的一个或多个列的键值的有序列表,创建索引的原因有2个: 确保一个或多个列中值的唯一性 提高对表进行的查询的性能.当查询时想要以更快的速度找到所需要的列,或 ...

  3. IBM应该请我去做Domino产品设计架构师

                                  作者: 亓锋                         2012年11月19日16:56  来源: 速途专栏              ...

  4. windows 10 更新失败及应用商店重装问题解决记录

    简单的记录一下这次遇到的问题及解决办法. 使用的windows 10 企业版一直不能更新成功,各种办法都试过了,都是失败然后回退. 这次直接下载了1709的映像进行升级安装的,因为我的是双系统,升级安 ...

  5. 比较MessageListActivity使用不同的layout

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...

  6. 关于js中的回调函数callback

    来源于:http://www.jianshu.com/p/6bc353e5f7a3 前言 其实我一直很困惑关于js 中的callback,困惑的原因是,学习中这块看的资料少,但是平时又经常见,偶尔复制 ...

  7. Git/Github的使用以及与Eclipse的整合

    Git简介       Git是一个免费的.分布式的版本控制工具,或是一个强调了速度快的源代码管理工具.每一个Git的工作目录都是一个完全独立的代码库,并拥有完整的历史记录和版本追踪能力,不依赖于网络 ...

  8. Dockerfile 构建前端nginx应用并用shell脚本实现jenkins自动构建

    Dockerfile 文件构建docker镜像 FROM centos MAINTAINER zh********h.cn RUN rm -f /etc/nginx/nginx.conf COPY n ...

  9. java struts2入门学习--OGNL语言基本用法

    一.知识点学习 1.struts2中包含以下6种对象,requestMap,sessionMap,applicationMap,paramtersMap,attr,valueStack; 1)requ ...

  10. 转载:kafka c接口librdkafka介绍之二:生产者接口

    转载:from:http://www.verydemo.com/demo_c92_i210679.html 这个程序虽然我调试过,也分析过,但是没有记录笔记,发现下边这篇文章分析直接透彻,拿来借用,聊 ...