Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift iOS 14.5在网络循环期间更新标签文本时出现问题_Swift_Xcode_Networking - Fatal编程技术网

Swift iOS 14.5在网络循环期间更新标签文本时出现问题

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!

我有一个通过网络更新远程数据库的循环。为了跟踪更新,我想在每次更新后使用计数器更新标签的文本。问题是标签文本仅在循环完成后更新。我尝试了许多DispatchQueue和DispatchGroup的组合,但都没有成功

下面的代码说明了这个问题。谢谢你的帮助

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中使用异步函数和完成处理程序的想法被苹果公司、许多开发博客以及这里的无数帖子广泛覆盖