缓存后的图像滚动

时间:2016-01-15 05:48:52

标签: ios objective-c iphone uitableview

我有多个部分,每个部分有10行。但是,滚动表格时它们不会顺利移动。他们有时会停下来。任何人都可以帮我找出原因吗?

  - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *simpleTableIdentifier = @"CustumCell";
        CustumCell *cell = (CustumCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
        if (cell == nil) {
            NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CustumCell" owner:self options:nil];
            cell = [nib objectAtIndex:0];
        }
        cell.selectionStyle = UITableViewCellSelectionStyleNone;

        if ([tableDataArray count] == 0) {
        } else {
            NSInteger index = indexPath.section * 10 + indexPath.row;
            NSString * newsValue =[[tableDataArray objectAtIndex:index]objectForKey:@"NewsValue"];
            NSDictionary * newsDict =(NSDictionary *)[newsValue JSONValue];


            cell.newsTitleLabel.text = [[tableDataArray objectAtIndex:index]objectForKey:@"Title"];

            UIImage *image;
            NSString *userString =[newsDict objectForKey:@"imgUrl"];


            if([[ImageCache sharedImageCache] DoesExist:userString] == true) {
                image = [[ImageCache sharedImageCache] GetImage:userString];

                cell.newsImage.image = [ImageResizer squareImageTo:image :CGSizeMake(75, 75)];
            } else {
                NSURL *url = [NSURL URLWithString:userString];


                NSURLSessionTask *task8 = [[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(), ^{

                                CustumCell *updateCell = (id)[tableView cellForRowAtIndexPath:indexPath];

                                if (updateCell)

                                                                 updateCell.newsImage.image = [ImageResizer squareImageTo:image :CGSizeMake(75, 75)];

                                [[ImageCache sharedImageCache] AddImage:userString :image];

                            });

                        }

                    }

                }];
                [task8 resume];
                        }

        }
        return cell;
    }

2 个答案:

答案 0 :(得分:0)

您似乎正在下载图像并在主线程上调整大小,主线程应仅用于UI内容。

您应该将下载移至后台线程,并且还应将调整大小代码移至后台线程。

参考此Lazy load images in UITableView  了解延迟加载的工作原理。

答案 1 :(得分:0)

管理要在UITableView中显示的图像下载非常棘手。通过简单的实现,如果用户快速滚动,则可以启动不再在表视图的可见部分中的图像的数十次下载。由于表视图行被循环使用,因此可以将图像插入到错误的表视图行中。

因此,我强烈建议使用为此目的而构建的图像缓存,例如SDWebImage