1

問題:

UITableView受け取るとすぐにコントローラーによってリロードされる がありNSNotificationます。cellForRowAtIndexPathが として使用するデータ構造はdatasource、テーブルの更新中に変更される場合があります。

背景:

アプリのデータ モデルが変更されるたびにが起動され、のを処理するNSNotificationmy who が " " メソッドを実行するように通知されます。" " メソッドはモデルから新しいデータを取得し、次に を要求します。これは、モデルが変更され、コントローラーに通知され、ビューが更新されるクラス MVC パターンです。データをすばやく変更するクイック通知が連続して発生すると、アプリがクラッシュします。テーブルが呼び出されている間、実行中にデータを含むデータ構造が変化しているように感じます。UITableViewControllerdatasourceUITableViewrefreshReloadrefreshReload[tableView reloadData]cellForRowAtIndexPath

これを回避するために従うべき良いパターンは何ですか?最初に停止を実行してから変更できるように、テーブルのリロードを停止する方法はありdatasourceますか?

4

2 に答える 2

1

あなたの質問を正しく理解できれば、グローバル フラグを使用してデータの変更をロックします。

たとえば、singletonパターンを使用してフラグ値を保持します。フラグがロックされているかどうかを確認します。フラグがロックされている場合は、データ変更メソッドを呼び出したり無効にしたりしないでください。UITableView の更新中は、更新が完了するまでフラグをロックします。

于 2013-09-02T08:08:53.057 に答える
0

データが非常に頻繁に変更されると、クラッシュが発生します。つまり、テーブルが更新され、テーブルが別のリロード コールを受けるときに発生します。

アプリのクラッシュを解決するには:

最初にできることは、リロード テーブルを頻繁に呼び出すのを避けることです。フラグを維持します(通知を受信するために設定した通知オブザーバーメソッドで)、そのフラグは、ユーザーがこのテーブルビュー画面に来たときにテーブルを今すぐリロードする必要があることを示し、1分ごとに(たとえば)メソッドを呼び出すタイマーを作成します。そのメソッドで flag をチェックし、YES の場合はテーブルをリロードし、フラグの値を NO に変更します。それ以外の場合は何もする必要はありません。

それがあなたの問題を確実に解決することを願っています。

于 2013-09-02T13:37:34.937 に答える