内存在UITableViewCell中增长

问题描述 投票:0回答:1

我的自定义单元格代码:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"ImageView"];
    NSURL *nsurl = [NSURL URLWithString:_imageUrls[indexPath.row]];
    NSData *data = [NSData dataWithContentsOfURL: nsurl];

    cell.imageView.image = [UIImage imageWithData:data];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"ImageView"];
    }

    return cell;

我有自定义类VKTableViewCell:

   @interface VKTableViewCell : UITableViewCell
    @property (weak, nonatomic) IBOutlet UIImageView *image;

    @end

图像大约为800x800(从站点解析)。当我滚动我的表时,内存正在增长(从20到30mb,加载100个图像)。为什么会这样?在这种情况下我必须做什么?我正在使用ARC。

ios uitableview custom-cell
1个回答
2
投票

你正在主线程上进行网络调用,这就是为什么它同时做两件事

  1. 渲染UITableView单元格
  2. 为图像进行网络调用

现在您必须从Main Thread to BackGround Thread转移网络调用逻辑

dispatch_queue_t callerQueue = dispatch_get_current_queue();
dispatch_queue_t downloadQueue = dispatch_queue_create("com.myapp.processsmagequeue", NULL);
dispatch_async(downloadQueue, ^{
    NSData * imageData = [NSData dataWithContentsOfURL:url]; //Make Network call on BackGround Thread

    dispatch_async(callerQueue, ^{
        // Assign Your Image to UIimageView of Cell here on Main Thread
        [cell setNeedsLayout]; // To Refresh Cell
    });
});

你也可以使用第三方Api AFNetWorkingSDWebImage

[imageView setImageWithURL:[NSURL URLWithString:@"http://i.imgur.com/r4uwx.jpg"] placeholderImage:[UIImage imageNamed:@"placeholder-avatar"]];

新解决方案:

懒惰加载UITableViewCell中的所有图像,只需创建如下的UIImageView扩展

extension UIImageView {
    func downloadImageFrom(_ link:String, contentMode: UIView.ContentMode) {

        guard let url = URL(string: link) else {
           return
        }
        URLSession.shared.dataTask(with: url) { [weak self] (data, response, error) in
            guard let `self` = self else { return }
            DispatchQueue.main.async {
                self.contentMode = contentMode
                self.image = UIImage(data: data ?? Data())
            }
        }.resume()
    }
}

功能调用:

cell.imageView.image = UIImage(named: "placeholder")  //set placeholder image first.
cell.imageView.downloadImageFrom(link: dataSource[indexPath.row], contentMode: UIViewContentMode.ScaleAspectFit)  //set your image from link array.
© www.soinside.com 2019 - 2024. All rights reserved.