2011-02-26 5 views
0

UITableViewのセルを動的に更新しようとしています。イベントはバックグラウンドスレッドが受け取るデータによってトリガされるため、すべてが非同期であり、イベントの順序を予測することは不可能です。reloadRowsAtIndexPaths:withRowAnimationを使用したワークフロー

この場合、ワークフローがどのようになっているのかわかりません。 reloadRowsAtIndexPaths:withRowAnimationを呼び出すときに、行数とインデックスパスが正しいことを確認するにはどうすればよいですか?以前のdeleteRowsAtIndexPaths:withRowAnimationの呼び出しによってアニメーションが実行される可能性があります。

変更がすべて同時に発生した場合は、beginUpdatesendUpdatesを使用できますが、上記の状況ではどうすればよいですか?

答えて

1

Hanno、コマンドオブジェクトモデルを使用してメインスレッドの変更をキューに入れることをお勧めします。ここで

は、方法は次のとおりです。

  • メインスレッドでコールバックでは、キュー(可変配列)にオブジェクトとして追加したり削除したり追加します。
  • あなたが中断するかどうかを決定し
  • (すなわち、最初のテーブルのステータスを取得し、中断することなく、それを処理し、キューの先頭を削除します)各操作がアトミックであることで、メインスレッド上のオブジェクトを追加および削除するキューを歩きますアニメーションがキューに追加のコマンドがある場合、またはアニメーションが終了するのを待ってから、次のキューに入れられたオブジェクトを処理します。

タイマーとanimationDidFinishコールバックが混在する必要があります。

+0

なぜそれほど複雑でなければならないのですか?-(私のケースでは、 'beginUpdates'と' endUpdates'の両方を呼び出すだけで、tableViewに強制的にセルジオメトリをリロードすることができます。 – hanno

0

とにかく(UIKitはメインスレッドで呼び出されなければならないため)メインスレッドですべてのテーブル更新を行う必要があるため、ここでは並行性の問題は発生しません。新しいデータを受け取るたびに、テーブルを更新するメインスレッドのメソッドを呼び出します。このメソッドは、終了するまでメインスレッドをブロックします。これは、テーブルビューが完全性を保持することを確認する必要があります。

または、行のアニメーションが重複していると心配ですか?

+0

メインスレッドですべてのUIKitを実行しています。しかし、アニメーションが行われてセルが削除され、別のセルを更新したい場合は、行数/ indexpathが混ざり合っています。 – hanno

関連する問題