3

NSFetchedResultsControllerとCoreDataでいくつかの厄介な問題が発生しています。いずれも、助けを得ることができて非常にありがたいです。

問題1-更新:バックグラウンドスレッドでストアを更新すると、特定の行が削除、挿入、または更新されます。変更は、「mergeChangesFromContextDidSaveNotification:」メソッドを使用してメインスレッドのコンテキストにマージされます。挿入と削除は適切に更新されますが、更新は更新されません(たとえば、セルラベルは変更によって更新されません)。ただし、挿入と削除とまったく同じように、contextDidSaveNotifcationを介して更新が行われることを確認しました。私の現在の回避策は、コンテキストの失効間隔を一時的に0に変更することですが、これは理想的な解決策ではないようです。

問題2-オブジェクトの削除:フェッチバッチサイズは20です。最初の20行にあるバックグラウンドスレッドによってオブジェクトが削除された場合、すべてが正常に機能します。ただし、オブジェクトが最初の20行の後にあり、テーブルが下にスクロールされると、「CoreDataは障害を実行できませんでした」というエラーが発生します。コンテキストを再保存し、frcフェッチを再実行しようとしましたが、まったく役に立ちませんでした。注:このシナリオでは、frcデリゲートメソッド「didChangeObject ....」は削除のために呼び出されません。これは、問題のオブジェクトがその時点で障害が発生していなかったためであると考えられます(初期フェッチ範囲外であったため)。 )。しかし、何らかの理由で、コンテキストはオブジェクトが存在すると見なしますが、はストアから削除されています。

問題3-セクションの削除:行を削除するとセクションが削除される場合、「セクション内の行数が無効ですか?」というメッセージが表示されます。エラー。NSFetchedResultsChangeMove:セクションから「reloadSection」行を削除して「[tableViewinsertRowsAtIndexPaths ....」に置き換えることでこれを回避しました。これは機能しているようですが、これが最善の解決策かどうかはわかりません。

どんな助けでも大歓迎です。ありがとうございました!

4

2 に答える 2

11

すべての問題は、フェッチされた結果コントローラーのキャッシュに関連していると思います。

問題1は、キャッシュされたオブジェクト(IDが変更されていない)を使用するFRCが原因で発生します。IDを変更してキャッシュを強制的に更新するオブジェクトを追加または削除したが、オブジェクトの属性を変更しても確実に更新されない場合。

問題2は、FRCがキャッシュ内のオブジェクトをチェックすることによって発生します。ほとんどの場合、オブジェクトには、キャッシュに保持されている障害のない関係があります。バックグラウンドでそれを削除すると、FRCは関係のもう一方の端にあるオブジェクトで障害を起こそうとしますが、できません。

問題3:同じ問題。キャッシュは変更を反映しません。

FRC以外のオブジェクトがデータモデルを変更している場合は、FRCのキャッシュを使用しないでください。2つのオプションがあります。

  1. (推奨)キャッシュを使用しないでください。FRCを作成するときは、キャッシュプロパティをnilに設定します。
  2. バックグラウンドプロセスがデータモデルを変更するたびに、キャッシュをクリアします。

もちろん、2つは、そもそもキャッシュを使用するという目的を打ち破ります。

キャッシュは、データの大部分が静的であるか、FRCが変更を管理している場合にのみ役立ちます。FRCは実際のデータモデルを繰り返しチェックして、データを現在理解していることを確認する必要があるため、その他の状況では使用しないでください。別の入力によって実際のオブジェクトが変更された可能性があるため、リスしたオブジェクトのコピーに依存することはできません。

于 2010-06-07T15:31:39.117 に答える
0

私のアドバイス:

  • バックグラウンドスレッドで必要な変更を検出する

  • ペイロードとしてメインスレッドに変更を投稿します

  • 実際の変更を行い、メインスレッドに保存します(メインスレッドの管理対象オブジェクトコンテキスト)

  • FRCのキャッシュを使用してください。パフォーマンスが向上します

  • Michael Privat、RobertWarnerによる「ProCoreDataforiOS」からの引用:

    「CoreDataはキャッシュをインテリジェントに管理するため、別の呼び出しによって結果が更新された場合、影響を受けた場合はキャッシュが削除されます。」

于 2012-07-24T18:22:28.610 に答える