0

嗨,我正在使用GCD 在 uitableview 中加载图像。现在,问题是图像动画。我从服务器调用了三个图像,它加载到单元中,但我遇到了 3 个问题

1) 单个图像在所有三个单元格中重复

2)第一个和最后一个单元格图像闪烁和变化

3)当图像改变时,它在所有单元格中重复。

即使我没有动画,它仍然动画,即闪烁

代码:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}

// Configure the cell...

[imageArray retain];

//get a dispatch queue
dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
 //this will start the image loading in bg
 dispatch_async(concurrentQueue, ^{ 
     NSData *image = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:[imageArray objectAtIndex:indexPath.row]]];

     //this will set the image when loading is finished
     dispatch_async(dispatch_get_main_queue(), ^{
        cell.imageView.image = [UIImage imageWithData:image];

         [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone];
         });
    });

return cell;

}

4

1 回答 1

1

你不应该在这个地方下载图像。

如果您没有太多行,请在例如执行此操作。viewDidLoad 并将下载的图像保存到新的可变数组中。

像这样的东西:

- (void) viewDidLoad {
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0ul);
dispatch_async(queue, ^{
        int row = 0;
        self.thumbnails = [NSMutableArray array];
        for (NSString *imageURLString in imageArray) {
        //Your way of download images
        NSData *imageData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:imageURLString]];
        UIImage *image = [UIImage imageWithData:imageData];
        dispatch_async(dispatch_get_main_queue(), ^{
            [self.thumbnails addObject:image];
            NSArray *indexes = [NSArray arrayWithObject:[NSIndexPath indexPathForRow:row inSection:1]];
            [self.tableViewOutlet reloadRowsAtIndexPaths:indexes withRowAnimation:UITableViewRowAnimationNone];
        });
        row++;
    }
});
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        if (self.thumbnails && [self.thumbnails count] > indexPath.row) {
            cell.attachmentImageView.image = [self.thumbnails objectAtIndex:indexPath.row];
        } else {
            cell.attachmentImageView.image = nil;
        }
}
于 2012-07-25T08:04:04.860 回答