Al utilizar NSPrivateQueueConcurrencyType
y NSMainQueueConcurrencyType
tipos de NSManagedObjectContext
, es seguro hacer anidado performBlock pide a la misma contexto?anidada performBlock: en NSManagedObjectContext
[backgroundContext performBlock:^{
NSFetchRequest *myRequest = ...;
__block NSArray *result= nil;
[backgroundContext performBlockAndWait:^{
results = [backgroundContext executeFetchRequest:myRequest error:NULL];
}];
}];
Puede parecer estúpido, pero tengo una base de código existente con una gran cantidad de métodos ayudantes que encapsulan los executeFetchRequest
llamadas. No quiero hacer suposiciones sobre si la persona que llama ya ha usado performBlock o no. Por ejemplo:
-(void)updateObjects:(BOOL)synchronous
{
if (YES == synchronous)
[self fetchHelper];
else
{
[backgroundContext performBlock:^{
[self fetchHelper];
}];
}
}
-(NSArray*)fetchHelper
{
[self.backgroundContext performBlockAndWait:^{
//Fetch the objects...
[self.backgroundContext executeFetchRequest: (...)];
}];
}
Lo he probado y funciona. Pero aprendí (por las malas) a ser muy cuidadoso con Core Data y multi-threading.
¿Qué pasa con performBlock, es ese reentrante también? – malhal
No es así, esto está cubierto en la sesión. Sus solicitudes se pondrán en cola si llama a performBlock ya que es asíncrono. –
para que quede claro, ¿qué está haciendo el OP en el segundo bit del código ?, ¿pero podría causar problemas si ambos métodos tuvieran "performBlock"? ¿Es esa la forma correcta de ver esto? – hokkuk