Swift 3:UIPickerView选择和UILabel刷新之间的延迟

Swift 3:UIPickerView选择和UILabel刷新之间的延迟,uipickerview,swift3,Uipickerview,Swift3,我有一个UIPickerView,一旦选择了某一行,它就会触发实现大量计算。如果用户等待计算完成,显示计算结果的UILabel(txtRunwayDest)将在大约5秒钟内成功刷新(当计算进行时)。为了防止用户在进行计算时继续旋转UIPicker(这可能会导致明显的延迟),我决定在选择行时显示一个带有旋转活动指示器的弹出视图。我把计算放在背景线上 @IBOutlet weak var txtRunwayDest: UILabel! let pckRunwayDest = UIPickerView

我有一个UIPickerView,一旦选择了某一行,它就会触发实现大量计算。如果用户等待计算完成,显示计算结果的UILabel(txtRunwayDest)将在大约5秒钟内成功刷新(当计算进行时)。为了防止用户在进行计算时继续旋转UIPicker(这可能会导致明显的延迟),我决定在选择行时显示一个带有旋转活动指示器的弹出视图。我把计算放在背景线上

@IBOutlet weak var txtRunwayDest: UILabel!
let pckRunwayDest = UIPickerView()

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)
{
    if (pickerView == self.pckRunwayDest)
    {
        print("CHECK 0")

        let alert = UIAlertController(title: nil, message: "Please wait...", preferredStyle: .alert)

        alert.view.tintColor = UIColor.black()
        let loadingIndicator: UIActivityIndicatorView = UIActivityIndicatorView(frame: CGRect(x: 10, y: 5, width: 50, height: 50)) as UIActivityIndicatorView
        loadingIndicator.hidesWhenStopped = true
        loadingIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.gray
        loadingIndicator.startAnimating();

        alert.view.addSubview(loadingIndicator)
        present(alert, animated: true, completion: nil)

        DispatchQueue.global(attributes: .qosBackground).async {

            ... // CODE


            if (row == 0)
            {
                ... // CODE
            }
            else
            {
                ... // CODE
            }

            DispatchQueue.main.sync {

                print("CHECK DISPLAY")

                // Refresh all values on screen
                self.displayValues()

                // Dismiss the popup view
                self.dismiss(animated: false, completion: nil)

            }
        } 
    }
}


func displayValues()
{
    if (someValue == nil)
    {
        self.txtRunwayDest.text = "Not selected";
    }
    else
    {
        print("START SHOWING TEXT")

        self.txtRunwayDest.text = appSingleton.runwayDestShared!.0 + " (" + appSingleton.runwayDestShared!.2 + ")"

        print("END SHOWING TEXT")
    }
}
因此,除了在完成所有计算并取消UIView后大约5-10秒,屏幕上会出现txtRunwayDest文本外,一切正常。在主线程启动后,控制台立即显示“EndShowText”,但正如我所说的,标签只有在显著延迟后才会更改


有什么想法吗?谢谢大家!

通过在后台线程中放置哪些代码以及在主线程中放置哪些代码,解决了这个问题。从长远来看,我将所有内容都放在DispatchQueue.main.sync中,所有内容都按预期工作。感谢Leo Dabus提供的宝贵建议。

应该是
DispatchQueue.main.sync()
不一样,你需要同步更新UI。我刚刚将代码更改为你建议的代码,遇到了同样的问题。