为啥 DispatchQueue.main.async 会影响单元格自动调整大小?

Posted

技术标签:

【中文标题】为啥 DispatchQueue.main.async 会影响单元格自动调整大小?【英文标题】:Why DispatchQueue.main.async do impact on the cell autoresizing?为什么 DispatchQueue.main.async 会影响单元格自动调整大小? 【发布时间】:2017-05-31 15:03:59 【问题描述】:

我正在处理UITableView 中显示的自动调整单元格。

它们表现良好,除非我尝试将图像从 DispatchQueue 设置为 UIImageView。当我直接设置图像时一切正常。

例子:

DispatchQueue.main.async 
  self._thumbnailImageView.image = image

您能否分享我缺少的内容以及为什么 DispatchQueue.main.async 块会影响单元格大小调整。

【问题讨论】:

如果您已经在主线程中,则不必执行DispatchQueue.main.async 来设置图像。这会降低性能,因为图像的设置会延迟。想象一下,当前的 UI 更新必须在 ios 应用再次使用主线程设置新图像并重绘之前完成。 @Hoa thx 的建议,但我使用 DispatchQueue.main.async 从后台线程设置图像。 【参考方案1】:

我的猜测是您的调用堆栈已经让表格视图知道它需要更新布局,但异步的没有。

添加一个

tableView.setNeedsLayout()

在 async 块中查看是否有效。您可能只需要在单元格上执行此操作。

【讨论】:

如果我从 tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) 调用这个可以吗?还是直接在代码块中调用? 它需要在该代码块中,以便在您更新图像后发生。 感谢您的帮助,但这一步对我没有帮助。【参考方案2】:

经过一番研究,我发现在这种情况下更适合使用:

DispatchQueue.global(qos: .userInteractive).async

因为服务质量等级。就我而言,我应该使用.userInteractive

与用户交互的工作,例如在主界面上进行操作 线程、刷新用户界面或执行动画。如果 工作不会很快发生,用户界面可能会出现冻结。 专注于响应能力和性能。

但我真的需要更多解释为什么 DispatchQueue.main.async 表现不佳。

【讨论】:

以上是关于为啥 DispatchQueue.main.async 会影响单元格自动调整大小?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 DataGridView 上的 DoubleBuffered 属性默认为 false,为啥它受到保护?

为啥需要softmax函数?为啥不简单归一化?

为啥 g++ 需要 libstdc++.a?为啥不是默认值?

为啥或为啥不在 C++ 中使用 memset? [关闭]

为啥临时变量需要更改数组元素以及为啥需要在最后取消设置?

为啥 CAP 定理中的 RDBMS 分区不能容忍,为啥它可用?