Il semble qu'en novembre, Apple ait mis à jour à la fois l'application Référence de classe NSManagedObjectContext et le Guide de programmation des données de base afin de bénir explicitement les GCD Dispatch Queues et les NSOperationQueues en série en tant que mécanismes acceptables pour synchroniser l'accès à un système de gestion de l'information. NSManagedObjectContext
. Mais leurs conseils semblent ambigus et peut-être contradictoires, et je veux m'assurer que je les ai bien compris.
Auparavant, il semblait admis qu'une NSManagedObjectContext
ne pouvait être consulté qu'à partir du thread qui l'avait créé, et que l'utilisation d'une file d'attente série pour la synchronisation n'était pas suffisante ; bien que les files d'attente série n'effectuent qu'une seule opération à la fois, ces opérations peuvent potentiellement être planifiées sur différents threads, et un MOC n'aime pas cela.
Mais maintenant, d'après le guide de programmation, nous avons :
Vous pouvez utiliser des threads, des files d'attente d'opérations en série ou des files d'attente de distribution pour la concurrence. Dans un souci de concision, cet article utilise le terme "thread" pour désigner l'un de ces éléments.
Jusqu'ici, tout va bien (bien que la confusion entre les fils et les files d'attente ne soit pas utile). Je peux donc utiliser sans risque un seul contexte par file d'attente (série), au lieu d'un par opération/bloc, n'est-ce pas ? Apple a même une représentation visuelle de ceci dans les sessions WWDC de Core Data.
Mais... où crée-t-on le contexte de la file d'attente ? Dans le NSManagedObjectContext
la documentation, l'état d'Apple :
[Un contexte] suppose que le propriétaire par défaut est le thread ou la file d'attente qui l'a alloué - ceci est déterminé par le thread qui appelle sa méthode init. Vous ne devez donc pas initialiser un contexte sur un thread puis le passer à un autre thread.
Donc maintenant nous avons l'idée d'un NSManagedObjectContext
ayant besoin de savoir qui est son propriétaire. Je suppose que cela signifie que la première opération à être exécutée dans la file d'attente doit créer le MOC et sauvegarder une référence à celui-ci pour que les autres opérations puissent l'utiliser.
C'est bien ça ? La seule raison pour laquelle j'hésite, c'est que les NSManagedObjectContext
L'article poursuit :
Au lieu de cela, vous devez transmettre une référence à un coordinateur de magasin persistant et faire en sorte que le thread/la file d'attente récepteur crée un nouveau contexte dérivé de celui-ci. Si vous utilisez NSOperation, vous devez créer le contexte dans main (pour une file en série) ou start (pour une file concurrente).
Apple semble maintenant confondre les opérations avec les files d'attente qui programment leur exécution. Cela me fait perdre la tête et me fait me demander s'ils veulent vraiment que vous créiez un nouveau MOC pour chaque opération après tout. Qu'est-ce que j'ai raté ?