2009-07-23 7 views
3

これは私のiPhone開発の最初の試みですが、Webサービスから返されたデータを表示するUITableViewControllerがあります。[tableview reloadData]の前にUITableViewControllerのリロードモデル

私のAppDelegateでは、数秒ごとに呼ばれるタイマーをセットアップし、モデルをリロードします。私は同じオブジェクト参照を保持し、内容を更新するだけですので、現時点で表示されているUITableViewControllerには同じオブジェクトがあります。

データはAppDelegateに更新され、私が呼ん:

[[(UITableViewController *)[self.navigationController topViewController] tableView] reloadData]; 

モデルは基本的にfileオブジェクトのコレクションです。各fileオブジェクトにはいくつかのプロパティとフラグがあります。

現在のUITableViewControllerが、各セルをfilesの配列の順次インデックスにマップする1つのセクションを持つ単純なテーブルである場合、これは非常にうまくいきます。

しかし、fileの詳細を示すUITableViewControllerのいずれかがあり、fileオブジェクトのフラグに応じて、2または3セクションが表示されます。私はここでこのロジックを入れている:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    if ([[_file status] intValue] & DOWNLOADING) { 
     kIndexTransferSpeed = 1; 
     kIndexSettings = 2; 
     return 3; 
    } else { 
     kIndexSettings = 1; 
     kIndexTransferSpeed = -1; 
     return 2; 
    } 
} 

だから、このコントローラに、私の-tableView:cellForRowAtIndexPath:はちょうどindexPathに応じて、_fileオブジェクトからプロパティを表示します大きなif文です。

この方法の問題は、このテーブルがデバイスに読み込まれているときに、実際にデバイスが再読み込みされていることがわかります。セクションのタイトルがしばらく点滅し、セルが表示されます。特に、リロード中にテーブルをスクロールしている場合。

私はこれらの方法に論理を当ててはいけないということをどこかで読んだことがあります。しかし、私は何をすべきですか?

私は、データビューモデルを作成し、データを- tableView:cellForRowAtIndexPath:で消費する準備ができていることを考え、AppDelegateが[tableView reloadData]を呼び出す前に呼び出すことにしました。しかし、同じオブジェクトであり、データモデル上で何が変更されたのか分からないので、呼び出されるたびにこのビューモデル全体を再作成する必要があります。

答えて

6

reloadDataは、出入りするセクション、相対的な順序で移動するオブジェクトなど、多くのことを処理する必要があります。実際に何が起こっているのかわからないと、何もできませんが、基本的に分解してテーブルを再構築します。

代わりに、発生した特定の変更をコントローラに知らせることができます。基本的には、コントローラ内のdataSourceを介してすべてのデータを再読み込みするビューの代わりに、コントローラは日付と方法を具体的に指示します。

reloadを呼び出すよりもはるかに多くの作業がありますが、より効率的で、消費電力が少なく、UIがより優れた情報を持っているため、全体が消えて再表示されるのを防ぐだけでなく、 。あなたが見てみたい

方法は以下のとおりです。

- (void)beginUpdates; // allow multiple insert/delete of rows and sections to be animated simultaneously. Nestable 
- (void)endUpdates;  // only call insert/delete/reload calls inside an update block. otherwise things like row count, etc. may be invalid. 

- (void)insertSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation; 
- (void)deleteSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation; 
- (void)reloadSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation; 

- (void)insertRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation; 
- (void)deleteRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation; 
- (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation; 

詳しい資料を入手できhereです。

+0

ありがとうございます!それで、-viewWillAppear:NSMutableArrayの「ビューモデル」を作成し、AppDelegateがデータを更新するときに、変更のリストを作成してコントローラの-refreshModelを呼び出すことができました。選択された行あれは正しいですか? – leolobato

+0

もちろん、あなたのモデルへのindexPathsは、indexPathsからあなたのポストアニメーションビューとは異なるアニメーションを作成する前に、あなたのビューへのindexPathsとは異なることに注意してください。それは動きの中で多くのものになることができるので、あなたの頭の周りにあなたの頭を包むためにしばらく時間がかかります。 –

+0

私の主な問題は、再描画されているテーブルを見ることができ、performSelectorOnMainThread:withObject:waitUntilDone:でreloadDataを呼び出すことを解決したことでした。私のモデルの処理方法を変更する必要はありませんでした。 – leolobato

関連する問題