gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 05:35:55 24 4
gpt4 key购买 nike

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

这是我的代码:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com