2017-02-06 4 views
0

が(毎秒)頻繁にこれを呼び出すとフリーズし、5分後にUIがよく毎秒UI

dispatch_async(dispatch_get_main_queue(), ^{ 
     [self.tableView reloadData]; 
}); 
+2

です。なぜtableviewのすべてのデータをリロードするのですか?可視セルをリフレッシュしたい場合は、それらのセルをリフレッシュするか、必要に応じてリフレッシュを処理できるロジックを変更します。 – Wolverine

+2

なぜこのコードを定期的に実行しますか?新しいデータがいつ利用可能であるかを知っていて、リロードだけを実行する必要があります。 – vikingosegundo

+0

より良いオプションは、更新されたレコード通知を受け取るために通知センターにUITableViewを登録することで、それに従ってUITableViewをリロードすることができます。 – viral

答えて

0

reloadDataをフリーズのUITableViewリロード非同期に実行されません。これは、メインスレッド(すべてのUI更新はメインスレッドで行われるはずです)で実行するのが間違っている間は、メインスレッドはビューがリロードされるまでハングすることを意味します。これを非常に頻繁に呼び出しているため、リロードするリクエストは、完了する前に再度呼び出されたため、互いに重なり合ってスタックを開始することがあります。これは、メインスレッドがロックアップしてUIがフリーズするときです。

あなたは

[self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:YES]; 

で別のを実行する前にリロードを待つスレッドを強制することができますが、私はそうすることであなたを警告します。代わりに、最初に毎秒テーブルを再読み込みする理由を再検討してください。

+0

説明と答えをありがとう。しかし、私はテーブルビューで表示する必要があるブルートゥースを介してデータを取得しています。データ速度は非常に高いので、毎秒200のオブジェクトをtableviewに追加する必要があります。 –