从UITableView单元格中的URL加载异步图像 - 滚动时图像变为错误的图像?

时间:2016-07-06 11:33:21

标签: ios uitableview uiimageview

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{   static NSString *CellIdentifier = @"cell";

    TVcell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
    if (cell == nil)
        cell = [[TVcell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

   cell.txtlabel.text = [[[arrayData objectAtIndex:indexPath.row] valueForKey:@"description"]stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];


    cell.IMGLabel.contentMode = UIViewContentModeScaleAspectFill;
    cell.IMGLabel.image = nil;

    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@",[enclosureUrlArray objectAtIndex:indexPath.row]]];

    NSURLSessionTask *task = [[NSURLSession sharedSession] dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        if (data) {
            UIImage *image = [UIImage imageWithData:data];
            if (image) {
                dispatch_async(dispatch_get_main_queue(), ^{
                        cell.IMGLabel.image = image;
                          [cell.IMGLabel setImage:image];
                          [cell.IMGLabel.layer setMasksToBounds:YES];
                          [cell.IMGLabel.layer setCornerRadius:2.5f];
                          [cell setNeedsLayout];

                });
            }
        }
    }];
    [task resume];

1 个答案:

答案 0 :(得分:0)

您的问题是,您无法保证NSUrlRequests将以与开始时相同的顺序终止。这很糟糕,因为您的单元格被重新使用以获得更好的性能,并且可能以奇怪的行为结束。

您可以在此处找到解决方法:Asynchronous downloading of images for UITableView with GCD

或者,您可以使用此处列出的工具来帮助您解决此问题:https://stackoverflow.com/a/32601838/3769338