iPhone实战:网络图片的加载

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

-(void)viewDidLoad{ios

   [super viewDidLoad];网络

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

   UIImage *img=[UIImage imageWithData:data];url

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

   [self.view addSubview:imgView];指针

   [imgView release];htm

}对象

       以上代码就是经过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;

  }

}

相关文章
相关标签/搜索