文档章节

iPhone实战:网络图片的加载

vimfung
 vimfung
发布于 2016/06/26 21:59
字数 987
阅读 22
收藏 0

 请求网络图片主要有两种方式,第一种是使用NSData的静态方法dataWithContentsOfURL或者对象的初始化方法initWithContentsOfURL来实现。其实现代码如下:

-(void)viewDidLoad{

   [super viewDidLoad];

   NSData *data=[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://img.baidu.com/hi/img/ihome/logo.gif"]];

   UIImage *img=[UIImage imageWithData:data];

   UIImageView *imgView=[[UIImageView alloc] initWithImage:img];

   [self.view addSubview:imgView];

   [imgView release];

}

       以上代码就是通过NSData加载了一张网络图片并由UIImageView显示到视图中。整个过程非常简单,但是上面所写的代码是一个同步的过程,也就是说如果图片尚未加载完成是不会执行程序的下一步的。如果想要加载的图片非常大,那么这个程序运行的时候还一直等待图片加载,在这个过程中用户是无法操作任何东西的。这样的话对于用户体验来说是非常不好的,因此,为了解决这样的问题可以采用异线程的方式进行。在原来的代码基础上修改为如下形式:

-(void)loadImage:(NSString *)url{

   NSData *data=[NSData dataWithContentsOfURL:[NSURL URLWithString:url]];

   UIImage *img=[UIImage imageWithData:data];

   _imgView.image=img;

}

-(void)viewDidLoad{

   _imgView=[[UIImageView alloc] initWithFrame:CGRectMake(0.0,0.0,100.0,100.0)];

   [self.view addSubview:_imgView];

   [_imgView release];

   //创建线程

   NSThread *thread=[[[NSThread alloc] initWithTarget:self selector:@selector(loadImage:) object:@"http://img.baidu.com/hi/img/ihome/logo.gif"] autorelease];

   [thread start];

}

       上面的方法基本上能解决大部分问题,但是如果想要在加载图片的时候知道加载图片的进度、加载的图片是否成功加载还是加载失败了,这些细化的操作则要使用我下面所说的第二种方法,使用NSURLRequest和NSURLConnection来加载图片。费用少说了先来代码:

-(void)viewDidLoad{

    _imgView=[[UIImageView alloc] initWithFrame:CGRectMake(0.0,0.0,100.0,100.0)];

   [self.view addSubview:_imgView];

   [_imgView release];

 

   NSURLRequest *request=[[NSURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://img.baidu.com/hi/img/ihome/logo.gif"];

   NSURLConnection *conn=[[NSURLConnection alloc] initWithRequest:request delegate:self];

   [conn start];

   [conn release];

   [request release];

 

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{

   //保存接收到的响应对象,以便响应完毕后的状态。    

   _response=[response retain];

}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{

  //_data为NSMutableData类型的私有属性,用于保存从网络上接收到的数据。   

  //也可以从此委托中获取到图片加载的进度。 

  [_data appendData:data];

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{

   //请求异常,在此可以进行出错后的操作,如给UIImageView设置一张默认的图片等。    

}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection{

    //加载成功,在此的加载成功并不代表图片加载成功,需要判断HTTP返回状态。

   NSHTTPURLResponse *response=(NSHTTPURLResponse *)_response; 

   if([response statusCode]/100==2){

      //请求成功

      UIImage *img=[UIImage imageWithData:_data];

      _imgView.image=img;

  }

}

       以上代码就是一个完整的请求过程,不过程序中有不完善的地方,如没有释放需要释放的对象以及请求出错后的处理等,因为这是例子所以这些就忽略掉了。虽然整个过程有一点的复杂不过他却可以对要加载的图片进行更细微的控制这是NSData不能取代的。

       最后在这里需要注意一点问题,如果你是在IOS4.3以上的机器上实现第二种方法的话,那么直接把接收到的数据来初始化UIImage的话,在UIImageView中显示出来的图片是黑乎乎一遍的。但是在IOS4.3以下版本却不存在。于是 我就尝试把用接收数据初始化的照片保存到相册,但它却提示无任何照片数据写入。这时候我就在想是不是接收数据的NSMutableData的数据指针已经指向了数据的最后了引起的。因此,我将接收数据的NSData赋予一个新的NSData后发现问题解决了。代码修改如下:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection{

    //加载成功,在此的加载成功并不代表图片加载成功,需要判断HTTP返回状态。

   NSHTTPURLResponse *response=(NSHTTPURLResponse *)_response; 

   if([response statusCode]/100==2){

      //请求成功

      NSData *data=[NDData dataWithData:_data];

      UIImage *img=[UIImage imageWithData:data];

      _imgView.image=img;

  }

}

© 著作权归作者所有

vimfung

vimfung

粉丝 61
博文 59
码字总数 85338
作品 4
广州
技术主管
私信 提问
教授花3K购入三个Python爬虫教材, 知乎大佬看完后大喜, 血赚!

一、前言 本文的实战内容有: 网络小说下载(静态网站) 优美壁纸下载(动态网站) 爱奇艺VIP视频下载 二、网络爬虫简介 网络爬虫,也叫网络蜘蛛(Web Spider)。它根据网页地址(URL)爬取网...

Python新世界
2018/08/02
0
0
Swift4.0开发笔记

目录 1、ATS配置 2、状态栏全局变亮白 3、懒加载 4、内存泄漏 5、常用的第三方库 6、反射机制 7、运行时 8、MD5加密 9、聊天界面 10、多线程GCD 11、 启动图尺寸大小 1、ATS配置 App 网络htt...

星星编程
2017/11/03
0
0
iOS 面试题之加载单张图片到底会不会崩溃?

今天,一哥们去某公司面试iOS职位。其中一道题目问,加载一张图片,到底会不会崩溃呢? 我拿到这个问题,当时以为是获取网络图片,那还是可能崩溃的,但实际问题,还有半句,图片是本地的。。...

萨斯辈的呼唤
2014/08/15
2K
1
iOS码农聊天室--zychat

ZYChat (一) 是一个实战项目的聊天UI框架,针对高频次高速率刷新最近会话列表和实际对话页面做了缓冲优化,经过测试会话使用的性能和体验非常稳定。 (二) UI框架参考MVVM思想设计,并采用自身...

ZYVincent
2016/01/04
3.6K
1
IOS软件开发视频教程要的来

IPhone开发实战视频教程内容介绍 1.iPhone开发实战视频教程-iOS开发视频教程 介绍了iPhone开发的开发环境iOS SDK,X-Code,Interface Builder,iTunes等;创建项目的基本步骤,项目工程中文件...

三毛钱
2016/07/09
248
3

没有更多内容

加载失败,请刷新页面

加载更多

rime设置为默认简体

转载 https://github.com/ModerRAS/ModerRAS.github.io/blob/master/_posts/2018-11-07-rime%E8%AE%BE%E7%BD%AE%E4%B8%BA%E9%BB%98%E8%AE%A4%E7%AE%80%E4%BD%93.md 写在开始 我的Arch Linux上......

zhenruyan
今天
4
0
简述TCP的流量控制与拥塞控制

1. TCP流量控制 流量控制就是让发送方的发送速率不要太快,要让接收方来的及接收。 原理是通过确认报文中窗口字段来控制发送方的发送速率,发送方的发送窗口大小不能超过接收方给出窗口大小。...

鏡花水月
今天
8
0
OSChina 周日乱弹 —— 别问,问就是没空

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @tom_tdhzz :#今日歌曲推荐# 分享容祖儿/彭羚的单曲《心淡》: 《心淡》- 容祖儿/彭羚 手机党少年们想听歌,请使劲儿戳(这里) @wqp0010 :周...

小小编辑
今天
897
11
golang微服务框架go-micro 入门笔记2.1 micro工具之micro api

micro api micro 功能非常强大,本文将详细阐述micro api 命令行的功能 重要的事情说3次 本文全部代码https://idea.techidea8.com/open/idea.shtml?id=6 本文全部代码https://idea.techidea8....

非正式解决方案
今天
5
0
Spring Context 你真的懂了吗

今天介绍一下大家常见的一个单词 context 应该怎么去理解,正确的理解它有助于我们学习 spring 以及计算机系统中的其他知识。 1. context 是什么 我们经常在编程中见到 context 这个单词,当...

Java知其所以然
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部