ios block一定会犯的几个错误
- - (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处
- - (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!
- - (void)viewWillAppear:(BOOL)animated
- {
- dispatch_queue_t downloadQueue = dispatch_queue_create(“Flickr downloader”, NULL);
- dispatch_async(downloadQueue, ^{
- NSData *imageData = [FlickrFetcher imageDataForPhotoWithURLString:photo.URL];
- <span style="color:#ff0000;">dispatch_async(dispatch_get_main_queue(), ^{</span>
- 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中访问成员变量有危险
so we can’t call photo.URL in downloadQueue’s t
- - (void)viewWillAppear:(BOOL)animated
- {
- <span style="color:#ff0000;"> NSString *url = photo.URL;</span>
- dispatch_queue_t downloadQueue = dispatch_queue_create(“Flickr downloader”, NULL);
- dispatch_async(downloadQueue, ^{
- NSData *imageData = [FlickrFetcher <span style="color:#ff0000;">imageDataForPhotoWithURLString:url];</span>
- 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。第三个错误,队列创建后没有释放,内存泄露
- - (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;
- }); });
- <span style="color:#ff0000;">dispatch_release(downloadQueue); //won’tactuallygoawayuntilqueueisemp
ios block一定会犯的几个错误的更多相关文章
- iOS block 机制
本文要将block的以下机制,并配合具体代码详细描述: block 与 外部变量 block 的存储域:栈块.堆块.全局块 定义 块与函数类似,只不过是直接定义在另一个函数里,和定义它的那个函数共享同 ...
- iOS Block的本质(二)
iOS Block的本质(二) 1. 介绍引入block本质 通过上一篇文章Block的本质(一)已经基本对block的底层结构有了基本的认识,block的底层就是__main_block_impl_ ...
- iOS Block界面反向传值
在上篇博客 <iOS Block简介> 中,侧重解析了 iOS Block的概念等,本文将侧重于它们在开发中的应用. Block是iOS4.0+ 和Mac OS X 10.6+ 引进的对C ...
- iOS block从零开始
iOS block从零开始 在iOS4.0之后,block横空出世,它本身封装了一段代码并将这段代码当做变量,通过block()的方式进行回调. block的结构 先来一段简单的代码看看: void ...
- ios Block详细用法
ios Block详细用法 ios4.0系统已开始支持block,在编程过程中,blocks被Obj-C看成是对象,它封装了一段代码,这段代码可以在任何时候执行.Blocks可以作为函数参数或者函数的 ...
- iOS Block的本质(四)
iOS Block的本质(四) 上一篇文章iOS Block的本质(三)中已经介绍过block变量的捕获,本文继续探寻block的本质. 1. block内修改变量的值 int main(int ar ...
- # iOS Block的本质(三)
iOS Block的本质(三) 上一篇文章iOS Block的本质(二)中已经介绍过block变量的捕获,本文继续探寻block的本质. 1. block对对象变量的捕获,ARC 环境 block一般 ...
- iOS Block的本质(一)
iOS Block的本质(一) 1.对block有一个基本的认识 block本质上也是一个oc对象,他内部也有一个isa指针.block是封装了函数调用以及函数调用环境的OC对象. 2.探寻block ...
- (译)IOS block编程指南 1 介绍
Introduction(介绍) Block objects are a C-level syntactic and runtime feature. They are similar to stan ...
随机推荐
- Android开发经典笔试面试题汇总(持续更新中)
1.我们都知道Handler是线程与Activity通信的桥梁,假设线程处理不当.你的机器就会变得非常慢,那么线程销毁的方法是:(A) A. onDestroy() B. onClear() C. o ...
- Xamarin.Android之定位
一.前言 打开我们手中的应用,可以发现越来越多的应用使用了定位,从而使我们的生活更加方便,所以本章我们将学习如何在Xamarin中进行定位的开发. 二.准备工作 因为我们的虚拟机是运行在电脑本地的,自 ...
- Spring框架使用(控制反转,依赖注入,面向切面AOP)
参见:http://blog.csdn.net/fei641327936/article/details/52015121 Mybatis: 实现IOC的轻量级的一个Bean的容器 Inversion ...
- adb forward交互流程
命令:adb forward tcp:6100 tcp:7100 // PC上所有6100端口通信数据将被重定向到手机端7100端口server上 或者adb forward tcp:6100 loc ...
- 基于Jmeter跟Jenkins的自动化性能测试的一站式解决方案(转)
www.MyException.Cn 网友分享于:2015-08-26 浏览:0次 基于Jmeter和Jenkins的自动化性能测试的一站式解决方案 作者: Yu, Qingguo Shen, ...
- centos-iso介绍
极简主义-Linu/Gnu-Linux //流行版本 http://archive.kernel.org/ #做rsync //centos-iso介绍 http://archive.kerne ...
- Ubuntu18.04下的 Android Studio 3.1.2
Android Studio安装 参考官网上的安装说明 # 安装依赖 :i386 lib32z1 libbz2-1.0:i386 安装openjdk (Update 2018-08-21: 这次重装U ...
- 这是一篇满载真诚的微信小程序开发干货
1月9日零点刚过,张小龙与团队正式发布微信小程序.它究竟能在微信8.5亿用户中牵动多少人,现在还很难说.但对于创业者来讲,小程序无疑带来了新契机,以及服务“上帝”们的新方式. 从今天起,只要开发者登录 ...
- 通过Parcelable协议传递数据出现系列错误
07-14 00:42:37.414: E/AndroidRuntime(17687): FATAL EXCEPTION: main 07-14 00:42:37.414: E/AndroidRunt ...
- Mybaits 使用多数据库源错误 --MapperScannerConfigurer配置
我在配置文件里面配置了一个数据源,数据源参数是根据配置文件加载.数据源在mybaits和自定义数据工具类中使用,但是启动工程后,报错如下: ### Cause: org.springframewor ...