2012-05-04 10 views
8

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.

Respuesta

8

Sí, performBlockAndWait es reentrante. Directamente desde notas de la versión de Apple ...

de Datos Básicos formaliza el modelo de concurrencia para la clase NSManagedObjectContext con nuevas opciones. Cuando crea un contexto , puede especificar el patrón de simultaneidad para usar con él: confinamiento de subprocesos, una cola de despacho privada o la cola principal de despacho . La opción NSConfinementConcurrencyType proporciona el mismo comportamiento que estaba presente en versiones de iOS anteriores a 5.0 y es el predeterminado . Al enviar mensajes a un contexto creado con una asociación de colas , debe usar el método performBlock: o performBlockAndWait: si su código no se está ejecutando en esa cola (para el tipo de cola principal ) o dentro del alcance de un performBlock. .. invocación (para el tipo de cola privada). Dentro de los bloques pasados ​​a esos métodos , puede usar libremente los métodos de NSManagedObjectContext. El método performBlockAndWait: admite la reentrada de API. El método performBlock: incluye un grupo de autorrelease y llama al método processPendingChanges al finalizar.

+0

¿Qué pasa con performBlock, es ese reentrante también? – malhal

+0

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. –

+0

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

Cuestiones relacionadas