2011-10-29 4 views
4

J'ai deux threads fonctionnant dans mon application.NSManagedObjectContext Locked

  • Dans le thread principal, je mets à jour les valeurs des clés dans les entités ou obtient des lignes à partir des données de base.
  • Dans le fil d'arrière-plan, je télécharge des données à partir d'un serveur.

Mais quelques fois au cours de la mise à jour/traitement des données de base sur [managedObjectContext executeFetchRequest:request error:&error]

... Je reçois:

#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:]() 

Comment le NSManagedObjectContext obtenir verrouillé? Que puis-je faire pour cela?

+0

Veuillez accepter les réponses appropriées à vos questions précédentes, vous obtiendrez probablement plus de bonnes réponses ici. – tilo

+0

J'ai également eu le même problème. Le corrigez-vous? –

+0

Oui .Assurez-vous que le même contexte managedobject n'est pas accessible sur plusieurs thread à la fois.Veuillez regarder par-dessus la réponse acceptée – Ritika

Répondre

3

Le verrou fait partie du fonctionnement normal et n'est pas la source de votre problème.

Très probablement, vous rencontrez un problème lors de la gestion du contexte sur les threads séparés. Assurez-vous d'utiliser un contexte différent pour chaque thread et assurez-vous de ne pas transmettre les objets gérés entre les threads. Assurez-vous de fusionner les contextes avant d'essayer d'accéder aux modifications apportées à un thread par un autre.

+0

Comme j'accède au contexte seulement sur le thread principal .so ce qui pourrait être la source de problème de gestion de contexte sur un seul thread Je fusionne également les changements faits sur le contexte – Ritika

+0

Le verrou suggère plusieurs threads ou au moins plusieurs contextes accédant au magasin en même temps. Le verrou est un verrou de mutex "posix thread" donc vous avez un accès multiple au magasin. – TechZen

+0

Vous dites plusieurs accès au magasin - voulez-vous dire le magasin utilisé par managedObjectContext, ou simplement le managedObjectContext - je pensais que deux managedObjectContexts différents sur différents threads pourraient avoir le même magasin ... (Je demande simplement parce que j'ai ce même problème , et ne peut pas voir où j'accéderais au même contexte sur plusieurs threads) – Rupert

1

Il peut être difficile de maîtriser CoreData dans les applications multithread. Assurez-vous de créer un nouveau NSManagedObjectContext pour chaque thread utilisant CoreData. Le MOC doit être créé dans le thread où il est utilisé. Le MOC lui-même n'est pas thread-safe. CoreData ne le verrouille pas pour vous. Si vous utilisez un nouveau MOC pour chaque thread, vous n'avez pas besoin d'effectuer le verrouillage. Dans votre pile, vous pouvez voir que NSPersistentStoreCoordinator est verrouillé (pas le MOC). CoreData fait cela pour qu'un seul MOC puisse accéder au NSPersistentStoreCoordinator en même temps.

+0

je viens d'utiliser MOC sur mon thread principal seulement pas dans le thread d'arrière-plan.Alors pourquoi NSPersistentStoreCoordinator est verrouillé? – Ritika

+0

Je l'ai dit dans ma réponse. Il garantit l'accès atomique à celui-ci. S'il ne peut pas le verrouiller, cela signifie qu'un autre thread y accède, de sorte que le thread en cours attend qu'il redevienne libre. – Felix

+0

J'ai un problème similaire. Mais quand il fait une pause, il semble que seul un thread (celui qui va le __psynch_mutexwait) l'utilise (com.apple.main-thread). Comment puis-je commencer à comprendre où est le problème? – Gujamin

Questions connexes