Swift iOS 14.5在网络循环期间更新标签文本时出现问题
我有一个通过网络更新远程数据库的循环。为了跟踪更新,我想在每次更新后使用计数器更新标签的文本。问题是标签文本仅在循环完成后更新。我尝试了许多DispatchQueue和DispatchGroup的组合,但都没有成功 下面的代码说明了这个问题。谢谢你的帮助Swift iOS 14.5在网络循环期间更新标签文本时出现问题,swift,xcode,networking,Swift,Xcode,Networking,我有一个通过网络更新远程数据库的循环。为了跟踪更新,我想在每次更新后使用计数器更新标签的文本。问题是标签文本仅在循环完成后更新。我尝试了许多DispatchQueue和DispatchGroup的组合,但都没有成功 下面的代码说明了这个问题。谢谢你的帮助 import UIKit class ViewController: UIViewController { var counter = 0 @IBOutlet weak var countLBL: UILabel!
import UIKit
class ViewController: UIViewController {
var counter = 0
@IBOutlet weak var countLBL: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func startClick(_ sender: Any) {
workloop()
}
func workloop() {
for _ in (0...3) {
networkTask()
counter += 1
countLBL.text = String(counter)
}
}
func networkTask() {
sleep(1)
}
}
你的基本假设和方法是错误的 在所有情况下,如果执行某个函数,则在退出该函数且应用程序通过事件循环之前,在该函数中应用的UI更改不会显示在屏幕上 此外,您不应该进行同步网络呼叫 你会有代码的想法
networkTask()
counter += 1
//update UI with info about completed network task
这是错误的。执行网络任务的函数应编写为异步操作。(它将立即返回,离开并执行网络任务,并在任务完成时调用完成处理程序。代码可能如下所示:
networkTask(completion: { results in
DispatchQueue.main.async {
// Code to display the results of the network operation to the UI
}
}
)
在Swift中使用异步函数和完成处理程序的想法被苹果公司、许多开发博客以及这里的无数帖子广泛覆盖