CoreData et Multi-thread
Bonjour,
Actuellement dans mon app, j'utilise 2 Contexts, un pour le main thread et un pour le background thread.
J'ai besoin dans mon application de type liste d'objects => détail d'un object
de rendre les modifications faite a un object "réversible", et je ne peux pas utiliser d'UndoManager.
Je crée un child context (avec comme parent le context du main thread) temporaire. Si mon utilisateur cancel ses modifications j'ai juste a ne pas sauvegarder le child context. Si il save, je merge le child context dans le parent.
Pour passer l'object du parent context au child context j'utilise le NSManagedObjectID.
Est ce la bonne façon de faire?
Exemple :
self.childContext = [NSManagedObjectContext MR_contextWithParent:self.parentContext];
self.item = (Item *)[self.childContext objectWithID:self.refItem.objectID];
Je comprend pas pourquoi GDCoreDataConcurrencyDebugging me sort plein de :
Invalid concurrent access to managed object
alors que je fait tout dans le main thread.
Merci d'avance.
Réponses
Y'a pas un moment où tu accèdes à ton objet dans un block qui serait exécutée dans une queue GCD ?
Du type completion block d'un download...
Je ne crois pas, c'est lors du release par ARC le problème
Je n'utilise que le NSManagedObjectContext brut et, lorsque j'avais des problèmes, j'ai trouvé ce code :
Je crois que c'est le NSPrivateQueueConcurrencyType qui est important.
En plus, il faut l'utiliser lorsque tu crées le "parentContext"
le parentContext, c'est le mainContext
Peut-être, si tu l'as nommé comme ça. Mais, toutefois, de mon expérience, il faut le créer avec NSPrivateQueueConcurrencyType
quand je dis mainContext, je veux dire c'est le context principal de l'application sur le main thread (NSMainQueueConcurrencyType)
Oui, bien entendu. Il faut changer la méthode qui crée le "mainContext"
Bah, c'est pourtant ce que je veux. Mais bon au final le problème n'est pas la. Tous fonctionne bien, sauf que GDCoreDataConcurrencyDebugging me signale un problème sur le release d'un NSManagedObject effectué par ARC. Ca ne fait pas crash l'app mais bon, c'est pas pour ca que c'est bien .
J'attend la release d'iOS8 + Xcode 6 pour faire des testes avec les nouveaux outils