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