swift - 我如何解决此 : UILabel. 文本必须仅从主线程使用

标签 swift multithreading

所以我正在尝试更新我的应用程序中的用户界面。发生的情况是标签得到更新,但是当它们不保留自己的值但有时会采用其他标签的值时。 另外,我收到消息说标签只能从主线程使用,我该如何解决这个问题?

这是我的代码:

let queue = DispatchQueue(label: "update")
queue.async {
   for s in self.fietshare.stands {
      for b in s.bikes {
         lbAvailable.text = "Available Bikes: " + String(s.id) +  "  " + String( s.bikes.count) // shows too big numbers
         nrOfAvailable.text =  String(b.distance) + "M"
         annotationView.layoutIfNeeded()
         print(s.id)
         print("Nr of bikes")
         print(s.bikes.count)
      }
   }
}

DispatchQueue.main.async {
   self.view.backgroundColor = . black;
   self.view.layoutIfNeeded()
}

if (Thread.current.isMainThread) {
    print("Main thread")
}

最佳答案

试试这个

let queue = DispatchQueue(label: "update")

queue.async {

    var available = ""
    var nrOfAvailable = ""
    for s in self.fietshare.stands{
        for b in s.bikes {
            available = available + "Available Bikes: " + String(s.id) +  "  " + String( s.bikes.count) // shows too big numbers
            nrOfAvailable = String(b.distance) + "M"

            print(s.id)
            print("Nr of bikes")
            print(s.bikes.count)
        }
    }

    // UPDATE UI after all calculations have been done
    DispatchQueue.main.async {
        lbAvailable.text = available
        nrOfAvailable.text = nrOfAvailable
        annotationView.layoutIfNeeded()

        self.view.backgroundColor = . black;
        self.view.layoutIfNeeded()
    }
}

解释:

  • 您使用 queue.async 启动一个异步任务
  • 在这个“后台作业”中,您启动一​​个 for 循环
  • 这个 for 循环需要更新一些 UI 位
  • 在主线程中执行此操作,这就是我们将该部分切换回主线程的原因

解释二:

  • UIKit 不是线程安全的。这意味着期望所有更改都来自主线程并且是同步的(一个接一个)。因此没有“锁定机制”或保护措施到位。如果您尝试同时从不同的线程更改标签,则可能会由于竞争条件而发生奇怪的事情,例如标签的某些部分被更改、顺序不同等。

关于swift - 我如何解决此 : UILabel. 文本必须仅从主线程使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58639685/

相关文章:

iphone - 使用 swift 更改 UINavigationController 标题时的延迟

ios - 使用 UserDefaults 快速存储数组

ios - SwipeGesture(当前模型/显示/显示详细信息/已弃用的推送)最多只能处理 4 个 View Controller 吗?

multithreading - 与任务并行相比,并行流水线有什么优势?

ios - Swift:将值从一个类传输到另一个类,或者具体来说从 ViewController 类传输到 NSObject

ios - WKWebView中如何实现 "Are you sure you want to submit the form again"

java - 线程因 sleep 而暂停后会发生什么?

C++ 多线程内联汇编

multithreading - gpars,命名线程

java - 无法命名后台线程,Void 错误