UIPickerViewを使用すると、特定の行が選択された後に多くの計算が実装されます。ユーザーが計算が完了するのを待つと、計算の結果を示すUILabel(txtRunwayDest)は、計算が行われている間に約5秒で正常に更新されます。計算が行われている間にUIPickerを回転させ続けているユーザーからアプリケーションを保護するために(重大な遅延を引き起こす可能性があります)、行が選択されたときにスピンアクティビティインジケータ付きのポップアップビューを表示することに決めました。私は計算をバックグラウンドスレッドに入れました。スイフト3:UIPickerViewの選択とUILabelのリフレッシュの遅れ
@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")
}
}
だから、すべてがtxtRunwayDestテキストは、すべての計算が行われているとのUIViewが却下された約5〜10秒後に画面上に表示されていることを除いて正常に動作します。メインスレッドが起動した直後にコンソールに「END SHOWING TEXT」と表示されますが、私が言ったように、ラベルは重大な遅れの後にのみ変化します。
アイデア?ありがとうございました!
'DispatchQueue.main.sync()'にする必要があります。 –
いいえ、同じこと! –
同じではなく、同期してUIを更新する必要があります –