2016-07-24 10 views
-1

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」と表示されますが、私が言ったように、ラベルは重大な遅れの後にのみ変化します。

アイデア?ありがとうございました!

+1

'DispatchQueue.main.sync()'にする必要があります。 –

+0

いいえ、同じこと! –

+0

同じではなく、同期してUIを更新する必要があります –

答えて

0

バックグラウンドスレッドに入れるべきコードとメインスレッドに入れるべきコードを巡って問題を解決するために管理しました。長期的には、すべてをDispatchQueue.main.syncに入れて、すべてが期待通りに機能します。貴重なアドバイスをいただいたLeo Dabusに感謝します。