2017-11-22 30 views
1

SVProgressHUDを使用して、アプリケーションがビジー状態であることを示しています。SVProgressHUDは、UITableViewが表示されるまで表示されません。

私のコードは以下のようになります。

 SVProgressHUD.show() 
     DispatchQueue.global(qos: .background).async { 
      parser.parse() 
      print("start reloading") 
      self.protocolTableView.reloadData() 

      print("end reloading") 
      SVProgressHUD.dismiss() 
     } 

私はこの警告を得る:

UITableView.reloadData() must be used from main thread only 

をと解析が行われた後のtableViewが表示されるまでにはかなり時間がかかります。

メインスレッドからパーズを読み込んだ後、tableViewを更新するにはどうすればよいですか?

おかげで、 バート

+0

はこれが動作することを確認されていない場合がありますが、prepareForSegue方法でshow()メソッドを入れてみてくださいすることができますか?または、私はあなたがメインスレッドでshow()呼び出しを実行しようとすると思う。 – Skywalker

+0

prepareForSegue()に移動するコードを更新しましたが、viewDidLoad()が終了するまでメインスレッドでのみ実行されるようです。 –

+0

'SVProgressHUD.show()'はすでに自身をメインキューに追加しています。再度明示的に行う必要はありません。 –

答えて

1

XMLParser.parseは、UIをブロックすることができます。バックグラウンドスレッドでそれをやってみてください:メインスレッドで

DispatchQueue.global(qos: .background).async { 
    parser.parse() 
} 
0
DispatchQueue.main.async { 
     self.protocolTableView.reloadData() 
     } 

リロードのtableView。

+0

私にとっては、DispatchQueue.main.asyncの代わりにDispatchQueue.main.syncを使用すると正しく動作しました –

+0

Welldone !!!少なくとも解決されました。 –

0

これは解決策だった。すべての助けを

SVProgressHUD.show() 
DispatchQueue.global(qos: .background).async { 
    parser.parse() 

    DispatchQueue.main.sync { 
     self.protocolTableView.reloadData() 
    } 

    SVProgressHUD.dismiss() 
} 

感謝!!

0

UIのアップデートは、メインスレッドで実行する必要があります。

SVProgressHUD.show() 
DispatchQueue.global(qos: .background).async { 
    parser.parse() 
    print("start reloading") 

    DispatchQueue.main.async(execute: {() -> Void in 
     self.protocolTableView.reloadData() 
     SVProgressHUD.dismiss() 
    }) 
} 
関連する問題