0
  • 学校のプロジェクト用に簡単な reddit アプリを作成しています。ライブラリを使用して、json( http://www.reddit.com/.jsonなど)を介してredditからデータをロードしていAFNetworkingます。

  • UIImageView各 reddit スレッドを、投稿のサムネイル用のを含むプロトタイプ セルと共に表示しています。

  • AFNetworkingメソッドを使用して、画像を遅延ロードする ために使用しようとしていますsetImageWithURLRequest

問題:アプリを起動すると、tableView を下にスクロールすると、すべてのサムネイルが遅延ロードされます。セルがビューから外れて上にスクロールするとすぐに、スクロールする前に正しいサムネイルが読み込まれていても、サムネイルがプレースホルダー画像に置き換えられます。

メソッドからの関連コードcellForRowAtIndexPath。遅延読み込みがsetImageWithURLRequestブロック で呼び出されています

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"threadCell";
    SubredditThreadCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    NSDictionary *tempDictionary   = [self.subredditArrayFromAFNetworking objectAtIndex:indexPath.row];
    NSDictionary *singleThreadDict = [tempDictionary objectForKey:@"data"];

    if ( [[singleThreadDict objectForKey:@"thumbnail"] isEqualToString:@"nsfw"] ){
        cell.postImageThumbnail.image = [UIImage imageNamed:@"NSFWIcon"];
    }
    else if ([[singleThreadDict objectForKey:@"thumbnail"] isEqualToString:@"self"]){
        cell.postImageThumbnail.image = [UIImage imageNamed:@"selfIcon"];
    }
    else if ([[singleThreadDict objectForKey:@"thumbnail"] length] == 0){
        cell.postImageThumbnail.image = [UIImage imageNamed:@"genericIcon"];
    }
    else{
        NSURL   *thumbURL = [NSURL URLWithString:[singleThreadDict objectForKey:@"thumbnail"] ];


        [cell.postImageThumbnail setImageWithURLRequest:[NSURLRequest requestWithURL:thumbURL]
                                 placeholderImage:nil
                                 success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image)
                                    {
                                        if (request) {
                                            [UIView transitionWithView:cell.postImageThumbnail
                                                    duration:1.0f
                                                    options:UIViewAnimationOptionTransitionCrossDissolve
                                                    animations:^{
                                                        [cell.postImageThumbnail setImage:image];
                                                    }
                                                    completion:NULL];
                                        }
                                    }
                                    failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error)
                                    {
                                        NSLog(@"failure loading thumbnail");
                                    }
         ];
    }

    return cell;
}
4

1 に答える 1

1

画像のダウンロードが完了したら、セルの postImageThumbnail を直接更新しないでください。

代わりに、UITableView にそのセルだけを更新するように指示します– reloadRowsAtIndexPaths:withRowAnimation:

パフォーマンスを向上させるために、 UITableView は、画面外にスクロールされたセル オブジェクトを再利用して、現在表示されているさまざまなデータを表示します。(これがdequeueReusableCellWithIdentifier:、「makeNew」ではなく「dequeueReusable」で始まる理由です。)これにより、UITableView は、テーブル内の行と同じ数のセルを作成して破棄する代わりに、表示されているセルの数だけを作成できます。ネットワーク リクエストが成功するまでにcell、ブロックがキャプチャした は別の行を表示するために使用されており、その行の画像をsuccess:上書きしています。

于 2013-05-16T03:03:02.460 に答える