将远程图像加载到 Tableview 单元格中

Posted

技术标签:

【中文标题】将远程图像加载到 Tableview 单元格中【英文标题】:Loading remote image into Tableview cell 【发布时间】:2020-04-04 09:33:37 【问题描述】:

我正在将服务中的图像提取到表格视图单元格中。我有图像 URL,我可以在cellForRowAtIndexPath 或表格视图单元格的layoutSubViews 方法中获取图像。哪个是获取远程数据最有效的地方

cellForRowAtIndexPath 方法

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell =  self.tableView.dequeueReusableCell(withIdentifier: "custom") as! MovieViewCell
    cell.title =  searchResultMovies[indexPath.row].title
    cell.movieImage = searchResultMovies[indexPath.row].poster
    return cell

layoutSubViews 方法

override func layoutSubviews() 
    super.layoutSubviews()
    if let title = self.title
        titleLabel.text = title
    
    if let movieImage = self.movieImage 
        movieImageView.loadImageFromString(imageString: movieImage)
    

如果您注意到上面的代码,您可以看到我正在从 layoutsubviews 内部调用 loadImageFromString,这也可以在 cellForRowAtIndexPath 完成。哪个地方比较好,为什么?

【问题讨论】:

【参考方案1】:

这是苹果文档对 layoutSubviews 的评价:

子类可以根据需要重写该方法以执行更精确 子视图的布局。仅当 子视图的自动调整大小和基于约束的行为不 提供你想要的行为。

由于加载图像与自动调整大小或调整约束无关,因此您会误用该方法。此外,layoutSubviews 通常会多次调用可见视图(例如当您旋转设备时)。您无需多次加载图像。

cellForRowAt 是下载配置单元所需的图像的适当方法。

【讨论】:

【参考方案2】:

两者之间没有可比性,但最佳实践是在自定义单元类中创建一个配置方法并使用要设置的模型调用它,layoutSubviews 用于当你需要做一些依赖的事情时使用在视图的范围内,顺便说一句,还要确保 loadImageFromString 使用像 SDWebImage 这样的缓存

【讨论】:

我们从哪里调用自定义单元类中的配置方法? cellForRowAt?

以上是关于将远程图像加载到 Tableview 单元格中的主要内容,如果未能解决你的问题,请参考以下文章

重新加载单元格中没有图像的表格视图重新加载

从 alamofire swift 的 tableview 单元格中的 url 加载图像

将图像保存到核心数据中并将其提取到 tableview 单元格中

在表格视图单元格中以编程方式显示图像

将数据从firebase加载到集合单元格内的tableview

图像不适合自定义表格视图单元格中的图像视图