1

製品を表示するために、アプリで CoreData を広く使用しています。すべてのデータ同期は別の NSManagedObjectContexts でバックグラウンドで行われ、変更の同期が完了すると呼び出しますmergeChangesFromContextDidSaveNotification

これは 99% の確率で完全に機能します。ここにそれが壊れているところがあります:

  1. アプリで商品を表示します。
  2. 価格を変更することにしたので、製品を管理して価格を変更する Web サーバーに移動しました。
  3. アプリに戻り、その製品から離れてブラウジングすると、アプリは Web サーバーで行われた変更をアプリに同期します。
  4. その商品をもう一度見に行きましたが、価格は変更されていません。
  5. アプリを完全に終了して再びアプリに戻ると、価格の変更が表示されます。

CoreData が製品のキャッシュされたバージョンを提供しており、アプリが再起動されるまで新しいバージョンが提供されないことが起こっていると思います。他のアイテムをたくさん表示しました。

mergeChangesFromContextDidSaveNotification myが呼び出された後、このキャッシュをクリアするにはどうすればよい ですか?

これは私と私のクライアントを夢中にさせています - 誰か私がこの状況を改善する方法を知っていますか?

4

1 に答える 1

2

まあ、これには実際には多くの理由が考えられます。Core Data の大きな利点の 1 つはその柔軟性ですが、これは大きな欠点の 1 つでもあります。

キャッシングとフェッチに関連して、データベースに設定できるノブがたくさんあります。ただし、最も簡単な方法の 1 つは、フェッチがデータベースまたは最新の MOC に行われる場合です。

つまり、これらを確認する必要があります。

- (BOOL)includesPendingChanges
- (BOOL)shouldRefreshRefetchedObjects

また、MOC はこれらの変更をマージする必要があるため、バックグラウンド更新と DidSave 通知を適切に処理していることを確認してください。

残念ながら、Core Data には、複数の MOC を使用する場合、発見しにくい相互作用がいくつかあります。すべての規則に従うように細心の注意を払う必要があります。

于 2012-08-14T19:43:30.563 に答える