Según la respuesta de Daniel Eggert en this question, cuando se utiliza un marco de objeto gestionado con NSPrivateQueueConcurrencyType
es necesario hacer nada que lo toca o los objetos que pertenecen a la misma dentro de performBlock:
o performBlockAndWait:
¿Es necesario realizar lecturas de datos centrales dentro de performBlock cuando se usa NSMainQueueConcurrencyType?
Es la misma verdad para NSMainQueueConcurrencyType
? Imagine el siguiente código que se ejecuta en el hilo principal, en un UIViewController por ejemplo:
self.moc = [[[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType] autorelease];
//moc setup
__block RHWidget *widget = nil;
[self.moc performBlockAndWait:^{
widget = [(RHWidget *)[self.moc objectWithID:self.widgetObjectID] retain];
}];
self.labelView.text = widget.descriptionString;
[widget release];
¿Es seguro utilizar el widget fuera del bloque, ya que sabemos que estamos en el hilo principal? O es necesario hacer esto:
__block NSString *description = nil;
[self.moc performBlockAndWait:^{
RHWidget *widget = (RHWidget *)[self.moc objectWithID:self.widgetObjectID];
description = [widget.descriptionString copy];
}];
self.labelView.text = description;
[description release];
hacer cosas cambian si hay otro NSManagedObjectContext
por ahí, posiblemente del tipo cola privada, haciendo el trabajo en bloques y empujando cambios hasta self.moc como parentContext
?
Este es un ejemplo ligeramente artificial, por supuesto, pero sería bueno pasar con seguridad ese widget a, por ejemplo, un controlador de vista modal que necesita acceder a algunas de las propiedades del widget. ¿Debo pasar el objectID del widget en su lugar y volver a registrarlo dentro del performBlock:
en el nuevo controlador de vista?
Hay un artículo muy completo [aquí] (http://www.cocoanetics.com/2012/07/multi-context-coredata/) que describe los diversos enfoques, incluidos los tipos de concurrencia de contexto y los contextos anidados. –