【问题标题】:Xcode 11.5 showing incorrect threadXcode 11.5 显示不正确的线程
【发布时间】:2020-12-14 01:26:44
【问题描述】:

最近我将当前的代码库从 Swift 4.2 (Xcode-10.3) 迁移到 Swift 5 (Xcode-11.5)。

在测试时,我在 tableView Datasource 上设置了一个断点,发现当前 (Xcode-11.5) 在断点处显示了后台线程。由于不可能在后台线程上运行 UIKit,这让我感到震惊。见附件

除非另有说明,否则只能从应用的主线程或主调度队列中使用 UIKit 类。此限制特别适用于从 UIResponder 派生的类或涉及以任何方式操纵应用程序用户界面的类。

  1. 如何解决此问题?
  2. 我的代码有问题吗?

【问题讨论】:

    标签: ios multithreading uitableview swift5 xcode11


    【解决方案1】:

    您必须添加更多信息,例如视图控制器和表视图的初始化位置和方式。

    您是否以编程方式设置表格视图的delegatedataSource?如果是这样,请在 DispatchQueue.main.async{} 块内尝试。

    如果不是这样,请使用 DispatchQueue 的 isMainThread 属性检查它是否是 cellForRow 内的主线程。并检查你在哪里初始化 tableView。

    在其他情况下,可以在后台线程中调用整个 View Controller。也检查一下。

    【讨论】:

    • UI 不会在后台线程上更新。 Tableview 正在完美更新,但 Xcode 显示后台线程。
    • @AlizainPrasla 从线程的名称来看,我假设它是按惯例创建的。检查声明并检查.reloadData() 是否在该线程内被调用。如果它实际上是一个后台队列,那么在更新 UI 元素时会出错。它会崩溃,错误会以紫色突出显示。
    • 在行委托的单元格上,我添加了一个断点并检查po Thread.isMainThread。它返回 true ibb.co/7KPZG08
    • 是的。这意味着线程实际上是主线程,但线程的“标签”是“..background..”。它可以声明为let aThread = DisPatchQueue(label: "background.thread", qos: .default),默认为主线程。因此,当您执行aThread.async {...} 时,它实际上会选择主线程。
    猜你喜欢
    • 2020-09-26
    • 2017-07-22
    • 2020-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多