異步懶人加載圖片(GET和POST請求方式)

異步加載圖片
首先你要實現你的GET和POST請求方式 (遵循NSURLConnectionDataDelegate)
因爲GET和POST的請求方式不一樣但是他們的請求過程都是一樣的
所以
我們需要寫一個GET的請求方法只需要傳入你的URLString就可以了
-(void)requestForGETWithUrl:(NSString *)urlString{
      NSURL * url = [NSURL URLWithString:urlString];
     NSMutableURLRequest * request = [[NSMutableURLRequest alloc] initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy    timeoutInterval:60.0];
    [request setHTTPMethod:@“GET”];
    [NSURLConnection connectionWithRequest:request delegate:self];
}
還需要些一個POST的請求方式你需要傳入你的URLString和你的具體的Data
- (void)requestForPOSTWithUrl:(NSString *)urlString postData:(NSData *)data
{
  //封裝URL對象
   NSURL * url = [NSURL URLWithString:urlString];
  //設置POST請求
  NSMutableURLRequest * request = [[NSMutableURLRequest alloc] initWithURL:url    cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
 [request setHTTPMethod:@"POST"];
 [request setHTTPBody:data];
 //建立異步連接,使用設置delegate方式實現
 self.connection = [NSURLConnection connectionWithRequest:request delegate:self];

最後就是實現你的delegate的四個方法在這些代理方法裏面你能知道數據請求的狀態 你可以做很多事情
你還要寫一個自身的代理並且你得寫三個你的代理執行的方法 是用來
- -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response  在這個方法裏面要創建一個空的可變的Data 這是開始解析了   在這裏你可以獲得你的數據的中長度NSHTTPURLResponse * httpResponse = (NSHTTPURLResponse *)response  總長度 = httpResponse.expectedContentLength  
httpResponse.statusCode這是狀態碼200表示是暢通無阻的
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data在這裏是接受下載下來的數據時一段一段的接受  所以你要去一個一個的拼接[總的data appendData:data]在這裏你可以獲得下載的進度哦就是你現在接受的數據的長度必上總長度
- (void)connectionDidFinishLoading:(NSURLConnection *)connection在這裏你可以返回你的總數據data  你可以接受這個data並且去解析,可以獲得你想要的數據
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error在這裏是失敗信息
還應該有個取消請求的方法
因爲你可能在點擊時候又快速返回了你的數據 還在請求所以你要在你的View消失的時候要停止網絡請求
所以你要定義一個NSURLConnection的屬性來接受你的GET和POST請求的那個Connection
在你的上個一面消失的時候你執行你的-(void)cancelRequest[_connection cancel];並且你的self.connection = nil;因爲你要保證下次請求的時候你的時空的
這些做完你要驗證下你寫的對不對
在這裏傳值的時候你要清晰的明白誰要傳給誰  根據他的哪一行去找下載那一張圖片
在封裝的時候你要清楚你是先在本地中還是你要開始下載
這裏的思維邏輯你是在你的展示的ViewController裏面讓其執行下載的方法  那麼你就要先判斷本地是不是有有的話就直接賦值沒有再下載
定義一個下載類專門下載圖片
在這個下載圖片類裏面你要明白是怎麼吧你的值傳過去的

//開始下載圖片 -(void)startDownLoadImageWithImageUrl:(NSString *)imageUrl {

   UIImage * image = [self locationImage:imageUrl]; 

  if (image == Nil) {//判斷本地有沒有        //沒有我就去下        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{  

         //子線程下載圖像          

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

       //並且將下載的圖片存到沙盒中       

    [data writeToFile:[self imageFilePath:imageUrl] atomically:YES];     

      //創建主線程去展示    

       dispatch_async(dispatch_get_main_queue(), ^{           

    UIImage * image = [UIImage imageWithData:data];       

        self.newsItem.newsImage = image;             

  if (_completionHandel) {//這裏的_compltionHandel是生命的Block的屬性((void)(^complitionHandel)(void))當你在回調 的時候你重寫set方法 並且給你的cell上賦值           

        _completionHandel();             

  }         

  });      

}); 

  } }

//獲取文件路徑

-(NSString *)imageFilePath:(NSString *)imageFileUrlString {  


NSString * cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]; 

  NSString * imagePath = [cachesPath stringByAppendingPathComponent:@"Images"];

   NSFileManager * fileManager = [NSFileManager defaultManager]; 

    if (![fileManager fileExistsAtPath:imagePath]) {      

        [fileManager createDirectoryAtPath:imagePath withIntermediateDirectories:YES attributes:Nil error:Nil]; 

  }  

     NSString * imageName = [imageFileUrlString stringByReplacingOccurrencesOfString:@"/" withString:@"-"];

     NSString * imageNameFilePath = [imagePath stringByAppendingPathComponent:imageName];

   return imageNameFilePath;

}

//獲得本地的圖片

-(UIImage *)locationImage:(NSString *)imageUrl {

   NSString * imageFilePath = [self imageFilePath:imageUrl]; 

   UIImage * image = [UIImage imageWithContentsOfFile:imageFilePath];  

   if (image) {    

      return image; 

  }  

return Nil;

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章