从NSData转换到UIImage非常慢,阻止UITableView

时间:2017-09-23 00:07:02

标签: ios swift uitableview uiimage

我从file.txt获得了NSData,当我从Core Data转换为NSData时,它使我的UITableView滚动速度非常慢。在将图像存储到UIImage之前,我已经调整了图像大小。有没有好办法做到这一点。起初,我想使用Core Data,但似乎没有这种方法来实现这一点。

Kingfisher

1 个答案:

答案 0 :(得分:1)

你的问题不是转换速度很慢,而是滚动时它已经完成了很多次。

为了优化UITable,iOS不会为n行创建n个单元格。它创建了x + 2个单元格(IIRC),其中x是可见单元格的数量。

当调用cellForRowAt时,调用dequeueReusableCell,它接受一个空闲单元格并将其分配给该行。这样,当您滚动时,不会发生对象的初始化,并且会减慢向下滚动。

您的代码(现在很明显)的问题在于,在将单元格分配给行之后,您再次转换图像并对其进行初始化。

您应该做的是提前初始化图像数组,例如在viewDidLoad中。然后你的代码看起来像:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
   let cellIdentifier = "ListTableViewCell"

   guard let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as? ListTableViewCell  else {
       fatalError("The dequeued cell is not an instance of MealTableViewCell.")
   }
   //cell.imageContentPhoto.kf.setImage(with: url)
   cell.imageContentPhoto.image = imagesArray[indexPath.row] // or something similar

  return cell
}

当然,如果你有很多不同的图像,可能值得做一些延迟加载。滚动时保留占位符图像,停止时仅加载相关图像。这当然要复杂得多,并留给学生练习。