Données de base et fils

Je suis en train de travailler sur une application qui utilise des données de base et je suis conscient que ce n'est pas sûr pour les threads mais que j'ai du mal à comprendre comment les gérer correctement. Laissez-moi vous expliquer ce que j'ai jusqu'ici …

J'ai créé un singleton les initiés l'object géré et est alors disponible à toutes les autres classs, cela semble fonctionner correctement puisque la même adresse d'object géré est reçue par toutes les classs.

J'ai alors deux classs qui sont exécutées dans cet ordre …

  1. Charge de données Cela obtient le nombre d'loggings et si zéro charge la database principale.
  2. Vue de table qui affiche ensuite datatables stockées à l'étape 1.

Mon problème est que l'étape 1. Retourne toujours zéro loggings, et l'étape 2. Travaille et renvoie le nombre d'loggings correct.

Après avoir testé le problème avec 1. En raison de l'exécution du thread, si j'expédie la requête sur le même thread que l'object géré, il fonctionne parfaitement.

Alors pourquoi est-ce en class 1. Je dois m'assurer que la requête est sur le bon fil mais en class 2. Cela fonctionne, ou est-ce juste de la chance? Existe-t-il une approche recommandée et documentée pour les threads et datatables de base?

Merci

La règle d'or pour la simultanéité dans datatables de base est la suivante: chaque NSManagedObjectContext ne doit être accessible qu'à partir d'un thread – le thread sur lequel il a été créé . En outre, un object géré ne peut être utilisé qu'avec le MOC avec lequel vous l'avez récupéré – ne le transmettez pas à d'autres MOC!

Mais vous pouvez partager un coordinateur de stockage persistant entre les threads, car chaque MOC verrouille le PSC lorsqu'il l'utilise. Une configuration commune consiste donc simplement à avoir un PSC pour plusieurs MOC.

Plus d'infos ici:

http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/CoreData/Articles/cdConcurrency.html

Si votre cas 2. semble fonctionner lorsque vous utilisez différents threads, je dirais que c'est plus une question de chance, et que ce n'est pas la bonne chose à faire. Ne countz pas sur la chance, suivez la règle que j'ai mentionnée ci-dessus et tout ira bien.

Lecture pertinente supplémentaire:

Qu'est-ce qu'on entend par CoreData n'est pas thread-safe?

http://www.cocoanetics.com/2012/07/multi-context-coredata/

http://www.cimgf.com/2011/05/04/core-data-and-threads-without-the-headache/

http://digitalflapjack.com/blog/2010/jun/11/parallelcoredata/

http://www.duckrowing.com/2010/03/11/using-core-data-on-multiple-threads/

En règle générale , il est utile de se callbacker que lorsque les API ou docs disent «Ne pas faire X», cela ne signifie pas que X va échouer ou rencontrer des problèmes à chaque fois – cela signifie simplement qu'il reviendra probablement à vous hante un jour. Ne laissez pas les choses au hasard, découvrez ce que vous êtes autorisé à faire (documents API, etc.) et faites-le.