La méthode recommandée par Apple pour le multithreading de données de base consiste à utiliser un contexte d'objet géré par thread et à envoyer les modifications d'un contexte à un autre en enregistrant le contexte du thread modifié dans un stockage persistant partagé.Est-ce que les autres threads peuvent avoir un accès indirect à un contexte d'objet géré s'exécutant dans un thread propre?
Bien que je puisse imaginer que cela soit bien pour, par exemple. un lecteur RSS, pour certaines applications, il semble loin d'être idéal. Dans mon cas, j'écris un séquenceur de musique qui enregistre des données & en utilisant un fil de fond. J'ai besoin que les données enregistrées soient accessibles au thread principal pendant l'enregistrement/la lecture. Avoir à constamment enregistrer et charger des données tout en enregistrant/en jouant serait assez mauvais, mais pire, il semblerait forcer l'utilisateur à enregistrer chaque fois qu'ils enregistrent ou jouent, ce qui crie un peu «terrible application».
Cependant, il semble qu'il pourrait y avoir un moyen de contourner ce problème. Si d'autres threads n'ont pas besoin d'accéder aux entités de données principales (uniquement les données qu'ils contiennent), qu'est ce qui m'empêche d'exécuter le contexte d'objet géré dans son propre thread et de n'autoriser que l'accès indirect aux autres threads? Objets à une propriété qui appelle performSelector:onThread:withObject:waitUntilDone:
sur le thread du contexte d'objet géré pour obtenir/définir des valeurs? Cela ne donne pas certains des avantages du multithreading (c'est-à-dire la mise à l'échelle des données de base vers les processeurs multicœurs), mais la plupart du temps, nous voulons que le multithreading évite de verrouiller l'interface utilisateur.
Je n'ai pas vu ce modèle préconisé pour les données de base. Étant donné que cela peut être une bête étrange et imprévisible quand vous ne faites pas exactement ce que Apple suggère, j'ai pensé qu'il serait utile de demander si cela évite vraiment les raisons pour lesquelles nous sommes découragés de laisser plusieurs threads accéder à un seul contexte d'objet géré .
Merci. Je suppose que ma pensée est qu'ayant plusieurs threads en train d'envoyer performSelector: onThread ... à un NSManagedObject mettra les messages en lecture/écriture dans une file d'attente, ce qui (je l'espère) nous donne le buffer et la file d'attente optimisés gratuitement. Quoi que NSManagedObject ait à faire en interne, il ne lancera pas l'accesseur # 2 jusqu'à ce qu'il soit terminé avec l'accesseur # 1, n'est-ce pas? –