1

loadImageのコールバックブロックを以下で実行すると、その時点からテーブルセルが再利用されている可能性があります。したがって、イメージは "imageView"に適用され、この再利用されたセルとは関係がありません。これは古いセルのイメージです。コールバックブロックで不要な結果を返すreuseidentifierを使用するUITableViewCell

イメージを持つセルごとに識別子を一意にすると、問題はなくなります。しかし、これは多くの結果でパフォーマンスが低下します。

どういうわけか、同じ再利用識別子をコールバックブロックで使用し、正しいセルにイメージを表示できますか?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    NSDictionary *place; 
    PlaceTableViewCell *cell; // UITableViewCell subclass 
    NSString *identifier = @"PlaceTableViewCell"; 

    if (cell == nil) { 

     NSArray *objects; 

     objects = [[NSBundle mainBundle] loadNibNamed:@"PlaceTableViewCell" owner:self options:nil]; 

     for(id object in objects) { 

      if([object isKindOfClass:[PlaceTableViewCell class]]) {     
       cell = (PlaceTableViewCell *)object;     
       break; 
      } 
     } 
    } 

    UIImageView *imageView; 
    if((imageView = (UIImageView*)[cell viewWithTag:1])) { 

     NSString *filename; 
     int placeImageId = 0; 
     place = [places objectAtIndex:indexPath.row]; 

     if(place) { 

      placeImageId = [[d objectForKey:@"placeImageId"] intValue]; 

      if(placeImageId) { 

       [[RestAPIConnector sharedInstance] loadImage :placeImageId :@"thumb" :^(NSString *response){ 

        NSDictionary *image = [response JSONValue]; 

        if ([image objectForKey:@"img"]) { 

         NSString *b64Img = [image objectForKey:@"img"]; 
         UIImage *ui = [UIImage imageWithData:[Base64 decode:b64Img]]; 

         imageView.image = ui; 
        } 
       }];    
      } 
     } 
    } 

    return cell; 
} 

答えて

1

ここは私がやっていることです。

代わりに、直接セルを使用してのダウンロードが完了したら、私はセルを取得するために、インデックスパスを使用して、インデックスパス

if(user.profileImage == nil) 
{ 
    if (self.tableView.dragging == NO && self.tableView.decelerating == NO) { 
     NSLog(@"file for user %d doesn't exist", [user.userId intValue]); 
     [self startUserProfileImageDownload:user forIndexPath:indexPath]; 
    } 
} 
else 
{ 
    cell.profileImageView.image = user.profileImage; 

} 

に渡していると、画像に

MessageCell *cell = (MessageCell *)[self.tableView cellForRowAtIndexPath:path]; 

// Display the newly loaded image 
cell.profileImageView.image = user.profileImage; 
CALayer *roundedLayer = [cell.profileImageView layer]; 
を更新

MessageCellは私のカスタムセルです。カスタマーセルを使用していない場合は、タグを使用してimageViewを取得できます。

1

私はその後、cellForRowAtIndexPath:

@property(retain)NSMutableDictionary *imageData; 

//... 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    //... 

    UIImageView *imageView; 
    if((imageView = (UIImageView*)[cell viewWithTag:1])) { 
     int placeImageId = 0; 
     place = [places objectAtIndex:indexPath.row]; 
     if(place) { 
      placeImageId = [[d objectForKey:@"placeImageId"] intValue]; 
      if(placeImageId) { 
       NSObject *image = [imageData objectForKey:[NSNumber numberWithInt:placeImageId]]; 
       if ([image isKindOfClass:[UIImage class]) { 
        imageView.image = (UIImage *)image; 
       } else if (![image isEqual:@"downloading"]) { 
        [imageData addObject:@"downloading" forKey:[NSNumber numberWithInt:placeImageId]]; 
        [[RestAPIConnector sharedInstance] loadImage:placeImageId onSuccess:^(NSString *response){ 
         NSDictionary *image = [response JSONValue]; 
         if ([image objectForKey:@"img"]) { 
          NSString *b64Img = [image objectForKey:@"img"]; 
          [imageData addObject:[UIImage imageWithData:[Base64 decode:b64Img]] forKey:[NSNumber numberWithInt:placeImageId]]; 
         } 
        }];    
       } 
      } 
     } 
    } 
    return cell; 
} 

に辞書から読み取るためにいくつかの潜在的な最適化しようとし、画像を保持するために辞書を作成したい:しない、@ Jun1stのサンプルのように

  • をスクロール中にセルの画像をロードする
  • NSOperationQueueにダウンロード操作を追加し、最後に要求されたものに優先順位を付けます(スクロールしたものの優先順位を下げる)
  • ダウンロードしたイメージをファイルシステムに保存して最初にチェックします
関連する問題