技术CTO-关注编程入门知识,提供编程入门教程

您的位置: 首页 > 移动开发 > ios > 正文

UITableViewCel里面图片太多,滑动的时候有卡顿,该怎么处理图片

来源: 技术CTO 阅读:

如题,UITableView里的每一个cell都有图片,有的cell最多有9张,图片我都是已经下载到沙盒里的,那么我滑动tableView的时候就会出现卡顿,这种情况下该怎么处理这个图片呢?

这要看你读取图片的逻辑是如果处理的,如果当要显示图片时再从沙盒中读取这样多少会有一点卡,可以考虑cache一定数量的UIImage到内存里。或直接用第三方代码,比如:
额,我的是下载图片到本地,然后在存本地的时候直接加载到内存里了,显示的时候直接用的内存里的image,也就是说我在下载的时候直接就存在内存里了,然后显示的时候直接显示的内存里的图片,本地我只是为了下载请求的时候不至于资源浪费
是否图片过大?可以缩小后生成UIImage再进行显示
检查一下你的代码在主线程中有没有用到这个函数- (BOOL)fileExistsAtPath:(NSString *)path,这个函数最好放到NSOperation中去,异步使用。在主线程中这个函数会阻塞UI,就是你滑动cell太快的话,频繁的去判断图片是否已经下载过到本地,会造成Cell一卡一卡的。

建议你用SDWebImage去缓存图片,然后加载图片的时候,选择异步回调。图片加载成功的时候用tableview的beginUpdate和endUpdate。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    PJJokeTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"TextJokeCell"];
    if (cell == nil) {
        cell = [[PJJokeTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"TextJokeCell"];
    }
    PJJoke *joke = self.jokes[indexPath.row];
    cell.time.text = joke.time;
    cell.text.text = joke.text;
    if (joke.imgurl && joke.imgurl.length > 0) {
        SDImageCache *imageCache = [SDImageCache sharedImageCache];
        if ([imageCache diskImageExistsWithKey:joke.imgurl]) {
            [cell.image setImage:[imageCache imageFromDiskCacheForKey:joke.imgurl]];
        } else {
            [cell.image setImageWithURL:[NSURL URLWithString:joke.imgurl]
                              completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType) {
                                  if (error == nil && image && joke && tableView) {
                                      joke.imageWidth = image.size.width;
                                      joke.imageHeight = image.size.height;
                                      [tableView beginUpdates];
                                      [tableView endUpdates];
                                  }
                              }];
        }
    }
    return cell;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    PJJoke *joke = self.jokes[indexPath.row];
    SDImageCache *imageCache = [SDImageCache sharedImageCache];
    if ([imageCache diskImageExistsWithKey:joke.imgurl]) {
        UIImage *image = [imageCache imageFromDiskCacheForKey:joke.imgurl];
        joke.imageWidth = image.size.width;
        joke.imageHeight = image.size.height;
    }
    return [PJJokeTableViewCell heightForJoke:self.jokes[indexPath.row]];
}
tableView的beginUpdate和endUpdate要比reloadData和reloadRowsAtIndexPaths好,因为beginUpdate和endUpdate会执行一个动画block,图片加载的时候显的很平滑。你自己试一下就知道了。

^_^ 如果您热爱技术、热爱编程,想与更多的朋友一起交流学习,欢迎加入本站官方QQ群:345733473 ^_^