2012-02-16 10 views
0

私はMySQLデータベースと同期しています。2つの異なるManagedObjectContextで同じNSManagedObjectを編集し、それらの変更をマージできますか?

最初は、すべての新しい/変更されたオブジェクトをループし、そのオブジェクトのすべての外部キーを設定してから、次のオブジェクトを実行するなど...しかし、それはフェッチ要求の多くです。

代わりに、すべての新しい/変更されたオブジェクトをループし、一度に1つずつ外部キーを設定したいと考えました。だから私のオブジェクト上の最初のパスはfk1を設定し、私の次のセットはfk2になります。

クールなフェッチ要求が大幅に削減されました。今私はこれらのfkセッターをスレッドすることができれば興味があります。彼らはお互いに依存していませんが、彼らは1つの関係を設定しているにもかかわらず、同じオブジェクトを変更しており、それは別の関係です。 gitという言葉で言えば、これらの変更は矛盾することなく一緒にマージできますが、一方の子managedObjectContext(childContext:save)の変更をparentManagedObjectContext(parent:performBlock^{parent:save})までプッシュして、それは別のchild managedObjectContext(???)内にありますか?または、マージポリシーは、childContextのオブジェクトのバージョンを1つだけ取り、他のfksは効果的に変更しません。 NSManagedObjectContext/refreshObject:mergeChanges:

をしかし、それはオブジェクトレベルでオブジェクト上にある

は、私は、これが存在することがわかっています。ウィルはフェッチの束を引き起こすでしょうか?それとも、私の全体の文脈をすぐに/バッチで更新しますか?ここからAppleの提案に続き

: 私はどんな関係、私は彼らにどんな関係を指すようにしようとする前に、すべてのエンティティがすでに存在して設定を開始する前に、私が作成した/私の値を更新しましたhttps://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdImporting.html

その他:かなりの量のデータを投げかけるので、並行処理の恩恵を受けることができるカップルアプリがあります。クワッドコアiPadアプリでは、最初の同期にかかる時間が本当に助けになります。 NSManagedObjectContext -

を:コアデータを操作するためのいくつかのガイドラインをあなたがやろうとしていると、なぜ(あなたがあなたの質問に以下の行を書き、より明確にすることができる)が、ここでは何か

答えて

0

I'nわかりませんスレッドセーフではありません。したがって、このマネージオブジェクトコンテキストへのアクセスを1スレッド内で制限する必要があります。そうしないと、あなたが理解できない多くのエラーが発生する可能性があります。 - NSManagedObjectContextsは、永続的なストアの「スナップショット」のように機能します。これは、オブジェクトを変更するときに永続ストアに保存し、NSManagedObjectContextDidSaveNotificationをポストし、永続ストアから最新のデータをロードするためにプログラム内の別の場所にmergeChangesFromContextDidSaveNotification:を呼び出すことを意味します。スレッドの安全性に注意してください。

NSManagedObjectContext/refreshObject:mergeChanges:appleによれば、管理対象オブジェクトを更新するだけではありません。 YESを2番目の引数として渡すと、この管理対象オブジェクトコンテキストから保留中のストアに保留中の変更が書き込まれ、このオブジェクトの他のプロパティに対するその他の変更が永続ストアからロードされます。永続ストア。 2番目の引数としてNOを渡すと、オブジェクトは保留中の変更を失い、フォールトに変わります。つまり、アクセスしようとすると、Managed Object Contextはオブジェクトを最後にデータベースに保存したときにそのオブジェクトをリロードします。管理対象オブジェクトのコンテキスト全体をリロードしません。オブジェクトに対してのみ動作します。

脇に:私はblog postと書いて、コアデータデータベースから非同期ロードの表面を傷つけています。私のケースでは、私はデータベースを使って重労働をしているので、独自のNSManagedObjectContextで動作するNSOperationを使用して終了し、シリアルGCDキューを使用して大量のデータを節約しました。たとえそれらが異なる管理対象オブジェクトのコンテキストで動作していても同じ永続ストアです。

私は助けてくれることを願っています。

+0

ありがとうございました。ええ、私はブロック操作を使用しています、そして、それは私がスレッドと言ったときに言いました。私はどのようにNSManagedObjectContext/refreshObject:mergeChanges:の仕組みについての説明が本当に私が後になったのかと思います。あなたのブログ記事を一瞥した後、できるだけジェネリックなものにしようとしているので、同期のForeignKey部分をマルチスレッド化することを再考するかもしれません。データモデルはかなり複雑になる可能性があります。私は今夜​​仕事の後でそれをもっと近づけるだろう。再度、感謝します。 – yellottyellott

関連する問題