2011-10-29 20 views
4

私は2つのスレッドが私のアプリケーションで動作しています。NSManagedObjectContextがロックされています

  • メインスレッドでは、エンティティ内のキーの値を更新したり、コアデータから一部の行を取得します。
  • バックグラウンドスレッドでは、サーバーからデータをダウンロードします。

しかし[managedObjectContext executeFetchRequest:request error:&error]

上のコアデータの更新/処理中にいくつかの時間...私が取得:

#0 0x34507c5c in semaphore_wait_signal_trap()
#1 0x34507f58 in semaphore_wait_signal()

#2 0x364d573a in pthread_mutex_lock() 
#3 0x35c91a2e in -[_PFLock lock]() 
#4 0x35c91a12 in -[NSPersistentStoreCoordinator lock]() 
#5 0x35c919e8 in -[NSManagedObjectContext(_NSInternalAdditions) lockObjectStore]() 
#6 0x35c90676 in -[NSManagedObjectContext executeFetchRequest:error:]() 

NSManagedObjectContextがロックされますどのように?これで何ができますか?

+0

これまでの質問に対する適切な回答を受け入れてください。これにより、ここでより良い回答が得られる可能性があります。 – tilo

+0

私も同じ問題がありました。あなたはそれを修正しますか? –

+0

はい。一度に複数のスレッドで同じmanagedobjectコンテキストにアクセスしないようにしてください。受け入れられた回答を確認してください。 – Ritika

答えて

3

ロックは通常の操作の一部であり、問​​題の原因ではありません。

ほとんどの場合、別のスレッドのコンテキストを管理するのに問題があります。スレッドごとに異なるコンテキストを使用し、スレッド間で管理オブジェクトを渡さないようにしてください。あるスレッド上で行われた変更に別のスレッドから行った変更にアクセスする前に、コンテキストをマージするようにしてください。

+0

私はメインスレッドでのみコンテキストにアクセスしています.soでは、単一スレッド上でコンテキストを管理する問題の原因は何ですか?コンテキストで行われた変更もマージします。 – Ritika

+0

ロックは複数のスレッドまたは複数のコンテキストが同時にストアにアクセスすることを示唆しています。ロックは 'posixスレッドmutexロック'なので、あなたはストアへの複数のアクセス権を持っています。 – TechZen

+0

あなたはストアへの複数のアクセスを言う - あなたはmanagedObjectContext、またはmanagedObjectContextだけで使用されるストアを意味する - 私は異なるスレッド上の2つの異なるmanagedObjectContextが同じストアを持つことができると思った...私が複数のスレッドで同じコンテキストにアクセスする場所を確認することはできません) – Rupert

1

マルチスレッドアプリケーションでCoreDataをマスタリングするのは難しい場合があります。 CoreDataを使用するスレッドごとに新しいNSManagedObjectContextを作成してください。 MOCは、使用されているスレッドで作成する必要があります。 MOC自体はスレッドセーフではありません。 CoreDataはそれをロックしません。スレッドごとに新しいMOCを使用する場合、ロックを行う必要はありません。 スタックトレースでは、NSPersistentStoreCoordinatorがロックされていることがわかります(MOCではなく)。 CoreDataはこれを実行して、同時に1つのMOCだけがNSPersistentStoreCoordinatorにアクセスできるようにします。

+0

私はメインスレッドでMOCをバックグラウンドスレッドでのみ使用しました。なぜNSPersistentStoreCoordinatorはロックされていますか? – Ritika

+0

私は私の答えでそれを言った。それは、それへのアトミックなアクセスを保証します。ロックできない場合は、別のスレッドがそのスレッドにアクセスしていることを意味します。したがって、現在のスレッドは再び解放されるまで待機します。 – Felix

+0

私も同様の問題があります。しかし、一時停止すると、それは唯一のスレッド(__psynch_mutexwaitのスレッド)が使用しているように見えます(com.apple.main-thread)。どのようにして問題がどこにあるのか把握することができますか? – Gujamin

関連する問題