Qu'est-ce que NSManagedObjectContext de performBlock: est-il utilisé?
Dans iOS 5, NSManagedObjectContext
a un couple de nouvelles méthodes, de performBlock:
et performBlockAndWait:
. Ce sont ces méthodes effectivement utilisées pour les? Que font-ils remplacer dans les anciennes versions? Ce type de blocs sont censés être passé pour eux? Comment puis-je décider de les utiliser? Si quelqu'un a des exemples de leur utilisation, il serait grand.
- Vouliez-vous dire "NSManagedObjectContext"?
- Je suis assez sûr qu'il a fait. Peut-être Nevan peut le suggérer à: stackoverflow.com/tags/nsmanagedobjectcomplex/synonyms
- Une correction des fautes d'orthographe, merci pour le heads up.
Vous devez vous connecter pour publier un commentaire.
Les méthodes
performBlock:
etperformBlockAndWait:
sont utilisés pour envoyer des messages à vosNSManagedObjectContext
exemple, si le MOC a été initialisé à l'aide deNSPrivateQueueConcurrencyType
ouNSMainQueueConcurrencyType
. Si vous faites quelque chose avec l'un de ces types de contexte, telles que le réglage de la persistance ou de l'enregistrement des modifications, vous le faites dans un bloc.performBlock:
va ajouter le bloc à la sauvegarde de la file d'attente et de planifier pour l'exécuter sur son propre thread. Le bloc sera de retour immédiatement. Vous pouvez l'utiliser pour les longues persistent opérations de la mémoire de sauvegarde.performBlockAndWait:
également ajouter le bloc à la sauvegarde de la file d'attente et de planifier pour l'exécuter sur son propre thread. Cependant, le bloc ne sera pas de retour jusqu'à ce que le bloc est terminée en cours d'exécution. Si vous ne pouvez pas vous déplacer jusqu'à ce que vous savez si l'opération a réussi, alors c'est votre choix.Par exemple:
Noter que parce que j'ai fait une
performBlockAndWait:
, je peux accéder à l'erreur à l'extérieur du bloc.performBlock:
nécessiterait une approche différente.De la iOS 5 de base de données notes de version:
performBlockAndWait:
ne pas bloquer le thread principal, n'est ce pas? C'est source de confusion qu'elle peut être attaché à la course principale de la boucle, mais il a un nom qui fait sembler comme il vous fait attendre.performBlock
ouperformBlockAndWait
ou je peux faire tout comme avant?^{block}
est terminée en cours d'exécution. Il se comporte comme tout bon vieux imbriquée sous-routine. C'est l'exécution est synchrone.performBlock
, ou seulement l'économie de la partie ?Ils vous permettent d'accéder à la même
managedObjectContext
à travers les fils.Je ne suis pas vraiment sûr que je suis correct, mais c'est la façon dont je l'utilise.
Vous utilisez
performBlockAndWait
est "comme d'habitude". Vous n'en avez pas besoin si vous exécutez le managedObjectContext sur un seul thread. Si vous exécuter sur le nombre de threads alors oui, vous aurez besoinperformBlock
.Donc, si vous êtes sur le thread principal, vous n'avez pas besoin de faire
performBlockAndWait
pour les principauxmanagedObjectContext
. Au moins je ne suis pas et se porte bien.Toutefois, si vous accédez à cet
managedObjectContext
sur d'autres threads alors oui, vous aurez besoin de faireperformBlockAndWait
.Donc, c'est le but de
performBlock
etperformBlockAndWait
.Quelqu'un s'il vous plaît corrigez-moi si je me trompe ici. Bien sûr, si vous accédez au contexte uniquement sur un fil, alors vous pouvez simplement utiliser la valeur par défaut.
NSManagedObjectContext
:Core Data uses thread (or serialized queue) confinement to protect managed objects and managed object contexts. A consequence of this is that a context assumes the default owner is the thread or queue that allocated it—this is determined by the thread that calls its init method. You should not, therefore, initialize a context on one thread then pass it to a different thread.
Ainsi,NSManagedObjectContexts
sont PAS thread-safe et vous ne pouvez pas y accéder à travers les threads.synchronous
ouasynchronous
de traitement). Voir la réponse de @MikeG et des commentaires relatifs à des fins de discussion à ce sujet.NSManagedObjectContexts
dans les threads. Ce que vous ne pouvez pas faire est de passerNSManagedObjects
dans les threads. Vous pouvez dire à votre contexte dans le thread principal pour enregistrer en faisant[mainContext performBlock:^{ NSError *error = nil; [mainContext save:&error]; };
à partir d'un autre thread.performBlock:
n', mais fait en appelant le fil d'attendre jusqu'à bloquer l'exécution est terminée.po [NSThread currentThread]
dans le débogueur à l'intérieur et à l'extérieur deperformBlockAndWait:
appeler et... Oh, c' vraiment exécuter sur le appelant thread. Merci pour le lien.