2009-12-29 18 views
10

Estoy trabajando en una aplicación para iPhone que utiliza Core Data. La aplicación hace una llamada a un servicio web, analiza el archivo XML resultante y luego crea o modifica los objetos de Datos principales en mi aplicación. Ya manejo la llamada al servicio web y el análisis de forma asíncrona, pero he estado devolviendo los datos analizados al hilo principal para manipular los objetos de Datos centrales. Me gustaría ejecutar este proceso en el hilo de fondo también. (A 1-2 segundos de pausa no hace para una gran experiencia de usuario)¿NSPersistentStoreCoordinator Thread Safe?

El enfoque obvio sería la creación de un contexto de objeto gestionado específicamente para el subproceso en segundo plano, pero luego leí esta línea en Apple's Core Data Programming Guide:

Un coordinador de tienda persistente proporciona a sus contextos de objetos gestionados la fachada de una tienda virtual. Para operaciones completamente simultáneas necesita un coordinador diferente para cada hilo.

Así que aquí está el truco: no puede tener dos NSPersistentStoreCoordinator s que proporcionan acceso a la misma tienda. Pero, el libro de datos básicos de Marcus Zarra afirma que NSPersistentStoreCoordinatores thread-safe y serializará las solicitudes de E/S (p. 157).

¿Alguien puede aclararme esto? ¿Es posible tener un segundo contexto de objeto gestionado ejecutándose en un subproceso separado compartiendo el mismo NSPersistentStoreCoordinator con el subproceso principal? O, de manera más sucinta, ¿es NSPersistentStoreCoordinator seguro para subprocesos?

+0

FYI puede tener varios PSC abriendo el mismo archivo de tienda. –

Respuesta

16

Posteriormente, Zarra señala que el contexto bloquea la tienda, por lo que está bien usar el mismo NSPersistentStoreCoordinator en los hilos.

Aunque el NSPersistentStoreCoordinator no es seguro para subprocesos bien, la NSManagedObjectContext sabe cómo que encaje correctamente cuando está en uso. Por lo tanto, podemos adjuntar tantos objetos NSManagedObjectContext a un único NSPersistentStoreCoordinator como que deseemos sin temor a una colisión.

2

¿Es posible tener un segundo contexto de objeto gestionado ejecutándose en un subproceso separado compartiendo el mismo NSPersistentStoreCoordinator con el subproceso principal?

Sí! Te recomiendo que leas detenidamente la sección correspondiente del libro de Zarra antes de aventurarte en el acceso de subprocesos a CoreData.

O, más sucintamente, ¿NSPersistentStoreCoordinator es seguro para subprocesos?

Bueno, la palabra `thread-safe 'tiene matices de significado en el documento de Apple, ¡así que ten mucho cuidado! Vea esto blog article para una buena explicación.

+0

Acabo de ordenar el libro de Zarra, pero mientras tanto, ¿qué hay del contexto gestionado? ¿Puedo tener un contexto singleton compartido por múltiples hilos? –

+0

No, necesita un contexto separado para cada hilo, pero se pueden vincular al mismo coordinador.Si ordena libros de Programador Pragmático directamente de ellos, puede descargar el libro electrónico inmediatamente mientras el papel se envía. – gerry3