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