为啥 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,为啥它受到保护?