bottom bar ios core-data ios5 nsmanagedobjectcontext blocking

ios - bar - ¿Qué es performBlock de NSManagedObjectContext: utilizado para?



status bar iphone (2)

En iOS 5, NSManagedObjectContext tiene un par de métodos nuevos, performBlock: y performBlockAndWait: ¿Para qué se usan estos métodos? ¿Qué es lo que reemplazan en versiones anteriores? ¿Qué tipo de bloques se les deben pasar? ¿Cómo decido cuál usar? Si alguien tiene algunos ejemplos de su uso, sería genial.


Le permiten acceder al mismo managedObjectContext hilos.

No estoy seguro de estar en lo correcto, pero así es como lo uso.

performBlockAndWait como "usual". No lo necesita si ejecuta managedObjectContext solo en un hilo. Si lo ejecuta en muchos hilos, entonces sí, necesitará performBlock .

Por lo tanto, si está en el hilo principal, no necesita performBlockAndWait para el managedObjectContext principal. Al menos yo no y estoy bien.

Sin embargo, si accede a managedObjectContext en otros hilos, entonces sí tendrá que realizar performBlockAndWait .

Entonces ese es el propósito de performBlock y performBlockAndWait .

Alguien podría corregirme si me equivoco aquí. Por supuesto, si accede al contexto solo en un hilo, simplemente puede usar el predeterminado.


Los métodos performBlock: y performBlockAndWait: se utilizan para enviar mensajes a su instancia de NSManagedObjectContext si el MOC se inicializó utilizando NSPrivateQueueConcurrencyType o NSMainQueueConcurrencyType . Si hace algo con uno de estos tipos de contexto, como establecer el almacenamiento persistente o guardar cambios, lo hace en un bloque.

performBlock: agregará el bloque a la cola de respaldo y lo programará para que se ejecute en su propio hilo. El bloque volverá de inmediato. Puede usar esto para operaciones persistentes largas en la tienda de respaldo.

performBlockAndWait: también agregará el bloque a la cola de respaldo y lo programará para que se ejecute en su propio hilo. Sin embargo, el bloque no regresará hasta que el bloque termine de ejecutarse. Si no puede continuar hasta saber si la operación fue exitosa, esta es su elección.

Por ejemplo:

__block NSError *error = nil; [context performBlockAndWait:^{ myManagedData.field = @"Hello"; [context save:&error]; }]; if (error) { // handle the error. }

Tenga en cuenta que debido a que hice un performBlockAndWait: puedo acceder al error fuera del bloque. performBlock: requeriría un enfoque diferente.

De las notas de la versión de datos principales de iOS 5 :

NSManagedObjectContext ahora proporciona soporte estructurado para operaciones simultáneas. Cuando crea un contexto de objeto gestionado utilizando initWithConcurrencyType :, tiene tres opciones para su asociación de hilo (cola)

  • Confinamiento (NSConfinementConcurrencyType).

    Este es el predeterminado. Promete que el contexto no será utilizado por ningún hilo que no sea el que lo creó. (Este es exactamente el mismo requisito de subprocesamiento que ha utilizado en versiones anteriores).

  • Cola privada (NSPrivateQueueConcurrencyType).

    El contexto crea y administra una cola privada. En lugar de crear y administrar un hilo o cola con el que se asocia un contexto, aquí el contexto posee la cola y administra todos los detalles por usted (siempre que use los métodos basados ​​en bloques como se describe a continuación).

  • Cola principal (NSMainQueueConcurrencyType).

    El contexto está asociado a la cola principal y, como tal, está vinculado al bucle de eventos de la aplicación, pero es similar a un contexto privado basado en cola. Utiliza este tipo de cola para contextos vinculados a controladores y objetos de interfaz de usuario que deben utilizarse solo en el hilo principal.