この質問は段階的ではありませんが、コードで詳しく説明できます。なぜ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には何も問題はないと確信しています。
すべてのオブジェクトをリフレッシュすると効果があります。私は、このメソッドを呼び出すことにパフォーマンスの影響があると仮定しますが、他には何か欠点がありますか? – Leon
*潜在的な欠点は、更新したオブジェクトに保存されていない変更があれば、それらを失う可能性があることです。 'refresh(_、mergeChanges:)'を使うと、2番目の引数に基づいて制御することができます。 'refreshAllObjects()'では、リフレッシュされたオブジェクトの保存されていない変更を失います。 –
よろしくお願いいたします。すべての変更はプライベートコンテキストで行われ、フェッチ要求は保存が完了した後にのみ実行されます。 – Leon