贴几段斯坦福大学关于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. 什么是XML RPC?

    # -*- coding: cp936 -*- #python 27 #xiaodeng #什么是XML RPC? #中文叫:远程过程调用 #使用http协议做传输协议的rpc机制,使用xml文本的方 ...

  2. code vs 2597 团伙

    题目描述 Description 1920年的芝加哥,出现了一群强盗.如果两个强盗遇上了,那么他们要么是朋友,要么是敌人.而且有一点是肯定的,就是: 我朋友的朋友是我的朋友: 我敌人的敌人也是我的朋友 ...

  3. Quartz.NET开源作业调度框架系列(四):Plugin Job-转

    如果在Quartz.NET作业运行时我们想动态修改Job和Trigger的绑定关系,同时修改一些参数那么该怎么办呢?Quartz.NET提供了插件技术,可以通过在XML文件中对Job和Trigger的 ...

  4. 微信小程序解决方案合集

    微信小程序解决方案合集:http://www.wxapp-union.com/special/solution.html 跳坑系列:http://www.wxapp-union.com/forum.p ...

  5. rac安装_grid安装校验报错之grid未建立信任关系

    原创作品,出自 "深蓝的blog" 博客,欢迎转载,转载时请务必注明下面出处,否则追究版权法律责任. 深蓝的blog:http://blog.csdn.net/huangyanlo ...

  6. hdu 4122 Alice&#39;s mooncake shop (线段树)

    题目大意: 一个月饼店每一个小时做出月饼的花费不一样. 储存起来要钱.最多存多久.问你把全部订单做完的最少花费. 思路分析: ans = segma( num[]*(cost[] + (i-j)*s) ...

  7. Android如何设置TextView的行间距、行高。

         Android系统中TextView默认行间距比较窄,不美观.     我们可以设置每行的行间距,可以通过属性android:lineSpacingExtra或android:lineSpa ...

  8. ios中tableview网封装(viewcontroller封装)常用的

    下载地址 http://pan.baidu.com/share/link?shareid=3657500168&uk=923776187 使用框架 1:asIHttpRequest库 2;SB ...

  9. windbg-.foreach循环输入(windbg script)

    .foreach .foreach 关键字分析一个或多个命令的输出并将该输出中每一个值作为另一个或多个命令的输入 .foreach [Options] ( Variable  { InCommands ...

  10. openstack neutron中涉及的网络设备

    一.openstack neutron网络设备介绍 Bridge(网桥) 用于将两个LAN连接起来,主要靠的MAC地址学习机制.当网桥的Port收到包时会将包的源mac和port ID关联起来记入ma ...