2017-11-03 5 views
1

この質問は段階的ではありませんが、コードで詳しく説明できます。なぜNSManagedObjectへの参照を格納すると更新できないのですか?

ここマーカスZarraで定義されている私たちは、民間とメインコンテキストでコアデータスタックを持っている:http://martiancraft.com/blog/2015/03/core-data-stack/

我々はフェッチ要求(メインコンテキスト)を行うとNSManagedObjectsの配列を返すために別のクラスを呼び出します。

NSArray *ourManagedObjects = [[Client sharedClient].coreDataManager fetchArrayForClass:[OurObject class] sortKey:@"name" ascending:YES]; 

私たちは、その後、いくつかの処理を行うと、参照を格納:

self.ourObjects = processedManagedObjects 

我々の見解ではのUITableViewが含まれており、このデータが使用されていますそれを埋めるためにはうまくいく。

私たちはCMS上のデータを変更し、UITableViewで更新して同期(プライベートコンテキスト)をトリガーし、同じ機能を呼び出して更新データを取得します。しかし、フェッチ要求は、たとえsqlite dbに直接新しいデータが含まれているかをチェックしても、まったく同じデータを返します。新しい値を表示するには、アプリケーションをリロードする必要があります。

私は、処理されたManagedObjectsを自分に割り当てないと、フェッチ要求が本当に正しいデータを返すので、NSManagedObjectへの参照を保持するように見えるので、メインコンテキストから新しいデータを取得することができません。しかし、私はそれがなぜあるのか分かりません。

これらの管理対象オブジェクトが更新されていなくても、他のものが更新されていても、Core Data Stackには何も問題はないと確信しています。

答えて

2

何が起こっているのがあるように聞こえる:

  • マネージドオブジェクトが自動的に変更が別の管理対象オブジェクトコンテキストを経由して行われた場合、永続ストアの最新データを反映するために自分自身を更新しません。
  • 結果として、オブジェクトへの参照を保持すると、オブジェクトはすでに保持しているデータを保持します。
  • 一方、参照を保持せずに再フェッチした場合、管理対象オブジェクトに古いデータがぶら下がっていないため、新しいデータが取得されます。

    • あなたはrefresh(_, mergeChanges:)方法やrefreshAllObjects()のいずれかを使用して、参照を保持し、あなたのコンテキストが管理オブジェクトを更新するかもしれない:

  • あなたはいくつかのオプションがあります。
  • あなたのアプリにとって意味がある場合は、NSFetchedResultsControllerを使用し、その代理メソッドを使用して変更を通知します。
  • 参照を保持しないでください。

最初はおそらく最も良いでしょう - refreshAllObjects()はおそらくあなたが望むものです。他のオプションはアプリの他の詳細に基づいている方が良いでしょう。

+0

すべてのオブジェクトをリフレッシュすると効果があります。私は、このメソッドを呼び出すことにパフォーマンスの影響があると仮定しますが、他には何か欠点がありますか? – Leon

+0

*潜在的な欠点は、更新したオブジェクトに保存されていない変更があれば、それらを失う可能性があることです。 'refresh(_、mergeChanges:)'を使うと、2番目の引数に基づいて制御することができます。 'refreshAllObjects()'では、リフレッシュされたオブジェクトの保存されていない変更を失います。 –

+0

よろしくお願いいたします。すべての変更はプライベートコンテキストで行われ、フェッチ要求は保存が完了した後にのみ実行されます。 – Leon

0

フェッチ要求のshouldRefreshRefetchedObjectsプロパティをtrueに設定してみてください。the documentationによると:あなたがオブジェクトをフェッチするとき

デフォルトでは、彼らは永続ストア内の値が変更された場合でも、彼らの現在のプロパティ値を維持します。このメソッドをパラメータtrueで呼び出すと、フェッチが実行されると、フェッチされたオブジェクトのプロパティ値が永続ストア内の現在の値で更新されます。

+0

これはうまくいきませんでした。 – Leon

関連する問題