CoreData et Multi-thread

AlakAlak Membre
août 2014 modifié dans Objective-C, Swift, C, C++ #1

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...


  • AlakAlak Membre
    août 2014 modifié #3

    Je ne crois pas, c'est lors du release par ARC le problème  :/


  • Joanna CarterJoanna Carter Membre, Modérateur
    août 2014 modifié #4

    Je n'utilise que le NSManagedObjectContext brut et, lorsque j'avais des problèmes, j'ai trouvé ce code :



    {
    NSManagedObjectContext *tempContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];

    tempContext.parentContext = self.airportsDataProvider.managedObjectContext;

    Je crois que c'est le NSPrivateQueueConcurrencyType qui est important.


     


    En plus, il faut l'utiliser lorsque tu crées le "parentContext"


  • AlakAlak Membre

    le parentContext, c'est le mainContext


  • Joanna CarterJoanna Carter Membre, Modérateur


    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

  • AlakAlak Membre
    août 2014 modifié #7

    quand je dis mainContext, je veux dire c'est le context principal de l'application sur le main thread (NSMainQueueConcurrencyType)


  • Joanna CarterJoanna Carter Membre, Modérateur

    Oui, bien entendu. Il faut changer la méthode qui crée le "mainContext"


  • AlakAlak Membre

    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 :/.


  • AliGatorAliGator Membre, Modérateur
    En même temps, GDCoreDataConcurrencyDebugging je trouve qu'il remonte pas mal de faux positifs... c'est aussi pour ça que je ne l'utilise pas spécialement au final...
  • J'attend la release d'iOS8 + Xcode 6 pour faire des testes avec les nouveaux outils


Connectez-vous ou Inscrivez-vous pour répondre.