2009-11-12 19 views
5

Sto passando alcuni dati NSManagedObject tra due thread utilizzando NSOperationQueue con livello di concorrenza a un massimo di 1 e vorrei alcuni suggerimenti sul fatto che sto facendo correttamente questo.Threading NSOperation e CoreData

Poiché NSManagedObject non è thread-safe, sto inviando l'NSManagedObjectID da ThreadA (thread principale) a ThreadB tramite una classe derivata NSOperation. Il flusso generale di lavoro:

ThreadA (thread principale):

  • crea NSPersistentStoreCoordinator
  • crea principale NSManagedObjectContext (1)
  • crea NSManagedObjectContext (2) per l'uso in workerThread

  • crea MyNSOperationItem, passa lungo NSManagedObjectContext e aggiunge MyNSOperationItem a NSOperationQueue

ThreadB (Il filo di NSOperationQueue):

  • NSOperation classe derivata recupererà i dati dal persistente
    negozio utilizzando l'objectID in dotazione.

La mia classe NSOperation si presenta così:

@interface MyNSOperationItem: NSOperation 
{ 
    // MyNSOperationItem is created in thread1 and MOC will be 
    // set on creation 
    NSManagedObjectContext *threadedMOC; 

    NSManagedObjectID  *workItemObjectID; 
} 
@end 

Quindi è bene per la mia NSOperation classe derivata di avere un riferimento a NSManagedObjectContext o devo conservare il secondo NSManagedObjectContext altrove? Poiché si tratta di una coda, sono state create numerose istanze di MyNSOperationItem, ciascuna delle quali punta allo stesso NSManagedObjectContext.

risposta

5

penso che questo dovrebbe darvi tutto ciò che serve:

http://developer.apple.com/mac/libra...reData/Articles/cdMultiThreading.html

Se è necessario scaricare il recupero su un thread in background, ecco un piccolo consiglio dal documento ho fatto riferimento in precedenza:

Recupero in un thread in background

uno dei più semplici multi-threading tecniche è possibile utilizzare con core Data per migliorare la reattività dell'applicazione è quello di eseguire una richiesta di recupero su un thread in background . (Si noti che questa tecnica è utile solo se si è utilizzando un negozio di SQLite, dal momento che i dati da negozi binari e XML viene letto in memoria immediatamente aperto.) Questo significa che se un recupero è complicato o restituisce un grande quantità di dati, è possibile restituire il controllo all'utente e visualizzare i risultati man mano che arrivano. Per un esempio di su come eseguire questa operazione, vedere l'esempioBackgroundFetching in /Developer/Examples/CoreData /.

Si utilizzano due contesti oggetto gestito associati a un singolo coordinatore di negozio persistente . Si recupera un contesto dell'oggetto gestito su uno sfondo thread e si passano gli ID oggetto degli oggetti scaricati a un altro thread. Nella la seconda filettatura (tipicamente thread principale dell'applicazione , in modo che si quindi possibile visualizzare i risultati), si utilizza il secondo contesto di difetto in oggetti con tali ID oggetto (si utilizza objectWithID: creare un'istanza dell'oggetto ).

+0

Il collegamento ha fatto riferimento a un'app di esempio chiamata "BackgroundFetching" in "/ Developer/Examples/CoreData" - nessuna directory di questo tipo esiste sul mio computer. Qualche idea su dove trovare quel campione? –

+0

Sì. Hai ragione. E non sembra essere più disponibile sul sito di sviluppo. Non sono sicuro di quale sia l'affare. È possibile presentare un bug di documentazione con Apple che indica le informazioni non aggiornate. Forse lo aggiorneranno con un nuovo percorso o collegamento. Poi di nuovo, forse lo aggiorneranno e rimuoveranno del tutto il percorso/collegamento. Mi dispiace per quello –