2011-11-14 8 views
0

私は2つのコアデータオブジェクトを持っています:OrganizationとPersonはリンクされています。コアデータ:異なるスレッドで2つのオブジェクトを変更するときのmutex /デッドロック?

私はそれらを異なるスレッドで変更して両方を保存すると問題がありますか?だから、スレッドが並列に実行されている:

スレッド1: を - NSManagedObjectID で組織をロード - オブジェクト に変更を加える - 保存オブジェクト

スレッド2: - NSManagedObjectID と負荷人 - に変更を加えますオブジェクト - オブジェクトを保存する

私のために、私はこれのためにミューテックスを得たようです。毎回ではありませんが、ときどき起こります。それが問題なら解決策は何ですか? :)

ありがとう!

ステファン

答えて

2

あなたが同じNSManagedObjectContextを使用している場合は、[はい、それは問題です。 Core-Dataは、スレッドセーフではありません。NSManagedObjectIDは、スレッドセーフです。バックグラウンドスレッドでは、同じストアで別のコンテキストを作成して保存しなければなりません。保存すると、メインスレッドが保存されて2つのコンテキストがマージされます。このマージを制御するには、マージポリシーを作成します。あなたはまだそれをやり遂げることができますが、望みどおりに簡単に行うことはできません。

+0

私は別々のNSManagedObjectContextsと1つのPersistentStoreしか持っていません。だから、私はそれがうまくいくはずだと思います。 – swalkner

+0

どのように結果をマージしますか?通知を設定しましたか? – utahwithak

+0

はい、通知が設定されています。変更は「[mainContext performSelectorOnMainThread:mergeChanges withObject:notification waitUntilDone:YES];」とマージされます。 – swalkner

0

スレッドを並列実行させないでください。 CoreDataは非常に効率的です。同じスレッドで順次データ操作を行い、一度保存してください。

コアデータは、非常にまれに2つ以上の必要性があるように設計されています。NSManagedObjectContext。そのようなコンテキストの1つは、常にある時点で1つのスレッド上で実行する必要があります。

EDIT

あなたはなど、Webサービスに依存しているので、それが不可能な場合、NSNotification Sの使用を検討してのみ、メインスレッド上で保存を行います。 ()。

+0

残念ながら、それほど簡単ではありません。バックグラウンドで実行中の非同期Web呼び出しがあります。時には組織を取得します:保管します。時々私は顧客の店を得る。 – swalkner

+0

私の答えを見てください。 – Mundi

+0

しかし、どのようにNSManagedObjectをメインスレッドに取得するのですか?私がバックグラウンドでオブジェクトを塗りつぶした場合、別のスレッドに渡すことはできません。 – swalkner

関連する問題