0

私はテキストの配列を反復処理しています。反復するたびに、次のようになります。

  • initWithEntity:insertIntoManagedObjectContextを使用して管理対象オブジェクトを作成する
  • テキストの解析
  • 表示順序の決定

新しく作成されたオブジェクトがテーブルビューに表示されます。

fetchResultsControllerの超クールな無料機能により、insertIntoManagedObjectContextが呼び出されると、セルがテーブルビューに自動的に挿入されます。

問題は、新しい各オブジェクトの処理にわずかな遅延(〜20ms)があり、テキスト行の順序が更新中のテーブルビューとは異なる順序になっていることです。これにより、すべてのセルが表示順序を理解し、他のセルがその後ろにすばやく挿入されるため、画面がちらつきます。(これが不明確な場合は、この効果のビデオを投稿できます。これほど説明するのは難しいとは思いませんでした。)

テキストの行を取得し、最初にそれらを別の配列に解析してから、その配列をmocに挿入するのは論理的ですが、これらは管理対象オブジェクトであるため、割り当てることはできません。 initWithEntity:insertIntoManagedObjectContextを呼び出します。これにより、セルがテーブルビューに自動的に挿入されます。

didChangeObjectメソッドでinsertRowsAtIndexPaths:withRowAnimationを取り出し、反復が終了したときにreloadDataを呼び出すだけでは機能しませんでした。(そうすべきですか?)

すべてのオブジェクトが作成されるまでテーブルを更新しないようにしたいだけです。 fetchResultsControllerがないと簡単ですが、fetchResultsControllerを使用してこれを行う方法がわかりません。SOに関する私の質問によく従うので、ここで何が欠けていますか?

4

1 に答える 1

0

テーブル ビューへの更新を停止するには、取得した結果のコントローラー デリゲートをnil次のように設定するだけです。

self.controller.delegate = nil;

更新を再開するには、デリゲートを再度設定し、最初のフェッチを実行して、テーブル データをリロードします。

self.controller.delegate = self;
BOOL success = [controller performFetch:&error];
[self.tableView reloadData];

performFetchデリゲートがない間は、フェッチされた結果コントローラーは管理オブジェクト コンテキストへの変更を追跡しないため、これが必要です。


または、2 番目の管理オブジェクト コンテキストを使用してバックグラウンド スレッドにデータを追加し、すべてのデータがインポートされたときにのみそのコンテキストを保存することもできます。

メイン スレッドは、バックグラウンド スレッドの に登録し、オブジェクトを更新するためにNSManagedObjectContextDidSaveNotification呼び出すことができます。mergeChangesFromContextDidSaveNotification:

この場合、フェッチされた結果コントローラーを変更する必要はありません。

于 2012-10-23T18:20:59.970 に答える