2016-03-28 12 views
1

私はカスタムセルを持つTableViewを持っています。このようなセルがたくさんあるので、このダウンロードを並列に(非同期に)実装する必要があります。私は画像の並列ダウンロードを有効にする必要が想定こと非同期キューにこの方法を、含むNSURLConnectionを使用してUITableViewの画像を非同期にダウンロードします。

#define myAsyncQueue dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) 

:画像のダウンロードとテーブルビューのセルを更新するため 私は次のコードを使用します。 - (無効)didClickStartAtIndex:(NSInteger)cellIndex withData:

(CustomTableViewCell*)data 
    { 
dispatch_async(myAsyncQueue, ^{   
self.customCell = data; 
     self.selectedCell = cellIndex; 
     ObjectForTableCell* tmp =[self.dataDictionary objectForKey:self.names[cellIndex]]; 

     NSURLRequest *urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:tmp.imeageURL] 
                cachePolicy:NSURLRequestReloadIgnoringLocalCacheData 
               timeoutInterval:60.0]; 
     self.connectionManager = [[NSURLConnection alloc] initWithRequest:urlRequest delegate:self]; 
     }); 
    } 
    -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
    { 
      self.urlResponse = response; 

     NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response; 
     NSDictionary *dict = httpResponse.allHeaderFields; 
     NSString *lengthString = [dict valueForKey:@"Content-Length"]; 
     NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; 
     NSNumber *length = [formatter numberFromString:lengthString]; 
     self.totalBytes = length.unsignedIntegerValue; 

     self.imageData = [[NSMutableData alloc] initWithCapacity:self.totalBytes]; 
    } 

    -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
    { 
      [self.imageData appendData:data]; 
     self.customCell.progressView.progress = ((100.0/self.urlResponse.expectedContentLength)*self.imageData.length)/100; 
      float per = ((100.0/self.urlResponse.expectedContentLength)*self.imageData.length); 
     self.customCell.realProgressStatus.text = [NSString stringWithFormat:@"%0.f%%", per]; 

    } 

    I tried to set this block to queue - main queue - cause its the place where image is already downloaded, 

     -(void)connectionDidFinishLoading:(NSURLConnection *)connection 
     { 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      self.customCell.realProgressStatus.text = @"Downloaded"; 

      UIImage *img = [UIImage imageWithData:self.imageData]; 
      self.customCell.image.image = img; 
      self.customCell.tag = self.selectedCell; 
    }); 
      [self.savedImages setObject:img forKey:self.customCell.nameOfImage.text]; 
      NSNumber *myNum = [NSNumber numberWithInteger:self.selectedCell]; 
      [self.tagsOfCells addObject:myNum]; 
     } 

すべてのキューがなければ(私はそれをコメント)すべてが正常に動作します - しかし、もののちょうど1ダウンロード。 しかし、結果としてキューを持つコードを実装しようとすると、何もダウンロードされません。私はsmhを間違えたと理解していますが、私はそれを定義することはできません。

事前にお問い合わせいただきありがとうございます。

+2

[ちょうどこのLIBを試す](https://github.com/rs/SDWebImage) –

+0

@Fahim:AFNetworking

[_imageView setImageWithURLRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://i.imgur.com/fVhhR.png"]] placeholderImage:nil success:^(NSURLRequest *request , NSHTTPURLResponse *response , UIImage *image){ NSLog(@"Loaded successfully: %d", [response statusCode]); } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error){ NSLog(@"failed loading: %@", error); } ]; 

EDITを使用して、画像のダウンロードについては

アドバイスをいただき、ありがとうございました。私は学んでおり、第三者の図書館がなくても自分で実装したいと思っています。少なくとも自分でやろうとしています。 – Melany

答えて

2

あなたはそれをフォームの基本を起動するための外を見た場合、私はあなたが、実装のほとんどが廃止されていたNSURLSessionNSURLConnectionようで始める必要があり、バック来る完全なリファレンスURL Session Programming Guidetutorial

についてiOSの9の後に使用することはできません推測あなたの質問にあなたはこれに似た何かをする必要がありますチュートリアル

// 1 
NSURLSessionDownloadTask *getImageTask = 
[session downloadTaskWithURL:[NSURL URLWithString:imageUrl] 

    completionHandler:^(NSURL *location, 
         NSURLResponse *response, 
         NSError *error) { 
     // 2 
     UIImage *downloadedImage = 
      [UIImage imageWithData: 
       [NSData dataWithContentsOfURL:location]]; 
     //3 
     dispatch_async(dispatch_get_main_queue(), ^{ 
     // do stuff with image 
     _imageWithBlock.image = downloadedImage; 
     }); 
}]; 

// 4 
[getImageTask resume]; 

からそれを取ったが、私の個人的なお勧めは、iOSネットワーキングのための最善とiOSアプリの世界でテスト/広く使用されているAFNetworkingのために行くです。非同期のダウンロード使用して同時実行

// get main dispact queue 
dispatch_queue_t queue = dispatch_get_main_queue(); 
// adding downloading task in queue using block 
dispatch_async(queue, ^{ 
    NSData* imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:imageURL]]; 
    UIImage* image = [[UIImage alloc] initWithData:imageData]; 
    // after download compeletes geting main queue again as there can a possible crash if we assign directly 
    dispatch_async(dispatch_get_main_queue(), ^{ 
    _imageWithBlock.image = image; 
    }); 
}); 
+0

vey muchありがとう、はい私はNSURLConnectionがdeprであることを知っています私はNSURLSessionに移動しますが、現在のところ、現在のプロジェクトでこの問題を解決する必要があります – Melany

+2

これは助けになる必要がありますhttp://stackoverflow.com/questions/12655360/images-downloaded-asynchronously-only-appear-in-uitableview -after-tap-or-scroll –

+0

ありがとうございました))。 – Melany

2

このサンプルコードをAppleから使用して、遅延読み込みの問題を解決してください。

+0

ありがとうございます。 – Melany

関連する問題