2009-12-29 18 views
10

Sto lavorando a un'app per iPhone che utilizza i dati principali. L'app effettua una chiamata a un servizio Web, analizza il file XML risultante e quindi crea o modifica gli oggetti di dati di base nella mia app. Gestisco già la chiamata al servizio web e analizzo in modo asincrono, ma ho passato i dati analizzati al thread principale per manipolare gli oggetti Core Data. Mi piacerebbe eseguire questo processo anche nel thread in background. (A 1-2 secondi di pausa non fa per una grande esperienza utente)Il thread NSPersistentStoreCoordinator è sicuro?

L'approccio più ovvio sarebbe quello di creare un contesto oggetto gestito specificamente per il filo di fondo, ma poi ho letto questa linea in Apple's Core Data Programming Guide:

Un coordinatore di negozio permanente fornisce ai propri contesti oggetto gestito la facciata di un negozio virtuale. Per operazioni completamente concorrenti è necessario un coordinatore diverso per ogni thread.

Quindi, ecco il trucco: non è possibile avere due NSPersistentStoreCoordinator s che fornisce l'accesso allo stesso negozio. Ma il libro di Core Data di Marcus Zarra afferma che NSPersistentStoreCoordinatorè thread-safe e serializzerà le richieste di I/O (pp. 157).

Qualcuno può chiarirlo? È possibile avere un secondo contesto dell'oggetto gestito in esecuzione su un thread separato che condivide lo stesso NSPersistentStoreCoordinator con il thread principale? O, più sinteticamente, è NSPersistentStoreCoordinator thread-safe?

+0

FYI è possibile avere più PSC che aprono lo stesso file di archivio. –

risposta

16

Zarra in seguito sottolinea che il contesto blocca l'archivio, quindi è possibile utilizzare lo stesso NSPersistentStoreCoordinator su thread.

Anche se il NSPersistentStoreCoordinator non è thread-safe sia, il NSManagedObjectContext sa bloccarlo correttamente quando è in uso. Pertanto, possiamo allegare tutti gli oggetti NSManagedObjectContext a un singolo NSPersistentStoreCoordinator come che vogliamo senza paura della collisione.

2

E 'possibile avere un secondo contesto oggetto gestito in esecuzione su un thread separato condividendo lo stesso NSPersistentStoreCoordinator con il thread principale?

Sì! Vi consiglio di leggere attentamente la sezione corrispondente del libro di Zarra prima di avventurarvi in ​​accesso multi-threaded a CoreData.

Oppure, in modo più sintetico, NSPersistentStoreCoordinator è thread-safe?

Bene, la parola `thread-safe 'ha sfumature di significato nel documento Apple, quindi state molto attenti! Vedere questo blog article per una bella spiegazione.

+0

Ho appena ordinato il libro di Zarra, ma nel frattempo, per quanto riguarda il contesto gestito? Posso avere un contesto singleton condiviso da più thread? –

+0

No, è necessario un contesto separato per ogni thread, ma possono essere collegati allo stesso coordinatore.Se ordini libri Pragmatic Programmer direttamente da loro, allora puoi scaricare l'ebook immediatamente mentre quello cartaceo viene spedito. – gerry3