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;

  }

}

相關文章
相關標籤/搜索