Actuellement, [octobre 2013] la Pomme de Simultanéité avec la Base de Données de la documentation est, au mieux, très trompeuse, car elle ne couvre pas toutes les améliorations que l'iOS 5 et donc n'affiche plus les meilleures façons d'utiliser la base de données simultanément. Il y a deux changements très importants dans iOS 5 - parent, de contextes et de nouvelles simultanéité/filetage types.
Je n'ai pas encore trouvé de documentation écrite qui traite de façon exhaustive de ces nouvelles fonctionnalités, mais la WWDC 2012 vidéo "Session 214 - Base de Données des Meilleures Pratiques" explique tout cela très bien.
Magique Record utilise ces nouvelles fonctionnalités et peut être en valeur un regard.
Les vrais principes de base sont toujours les mêmes -, vous pouvez toujours utiliser des objets gérés au fil de leurs géré contexte de l'objet a été créé.
Vous pouvez maintenant utiliser [moc performBlock:] pour exécuter du code sur le fil de droite.
Il n'y a pas besoin d'utiliser mergeChangesFromContextDidSaveNotification: plus; au lieu de créer un enfant de cadre pour faire les changements, puis enregistrer l'enfant contexte. Économiser de l'enfant est le contexte qui va pousser automatiquement les modifications dans le contexte parent, et pour enregistrer les modifications sur le disque, il suffit de faire une sauvegarde sur le contexte parent dans son thread.
Pour que cela fonctionne, vous devez créer le contexte parent avec un concurrent de type, par exemple:
mainManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
Puis sur le thread d'arrière-plan:
context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSConfinementConcurrencyType];
[context setParentContext:mainManagedObjectContext];
<... perform actions on context ...>
NSError *error;
if (![context save:&error])
{
<... handle error ...>
}
[mainManagedObjectContext performBlock:^{
NSError *e = nil;
if (![mainContext save:&e])
{
<... handle error ...>
}
}];