Il dibattito tra GCD e NSOperation
riduce sostanzialmente verso il basso per l'argomento di utilizzare il più alto livello di astrazione che ti fornisce una buona soluzione.
NSOperationQueue
è costruito sopra GCD, quindi deve essere un livello più alto di astrazione.
Tuttavia, GCD è così facile da usare nel caso generale, che trovo che sia preferibile a NSOperationQueue
in molti casi.
Ora, quando si introduce CoreData nel mix, suggerirei una terza alternativa. Se si utilizza iOS 5, è possibile utilizzare la concorrenza della coda privata con il MOC. Trovo che sia una buona astrazione e fornisce un'interfaccia facile da usare.
Quindi, suggerirei di creare semplicemente un MOC con NSPrivateQueueConcurrencyType
per ogni thread in cui si desidera eseguire i dati principali. È possibile scegliere, in base alle caratteristiche dell'applicazione, se condividere uno persistentStoreCoordinator
o utilizzarne uno separato. Potresti anche usare i contesti nidificati (con un avvertimento per il lato di inserimento).
In sostanza, si segue questo modello ...
NSManagedObjectContext *moc = [[NSManagedObjectCotext alloc] initWithConcurrencyType:NSPrivateQueuqConcurrencyType];
moc.parentContext = contextIWantToBeParent;
moc.persistentStoreCoordinator = pscIWant;
[moc performBlock:^{
// Your MOC stuff running on its own private queue
}];
Naturalmente, è necessario scegliere un metodo (sia genitori a un MOC esistente o allegati di un PSC).
Generalmente preferisco il metodo performBlock
.
EDIT
Grazie. Ho letto che NSManagedObject non è thread-safe. Come potrei creare nuovi NSManagedObjects su quella coda privata? - Helium3
Sì, è vero. Tuttavia, quando crei un MOC con un tipo di concorrenza, accetti un contratto simile a questo.
io, un programmatore astuto, solennemente concordano ai seguenti dati regole di base in materia di concorrenza:
Se uso NSConfinementConcurrencyType
, userò solo durante l'esecuzione sul thread che lo ha creato.
Se utilizzo NSPrivateQueueConcurrencyType
, userò solo il MOC dall'interno di performBlock
o performBlockAndWait
.
Se uso NSMainQueueConcurrencyType
, userò solo il MOC dall'interno sia performBlock
, performBlockAndWait
, o quando so che sto facendo funzionare sul thread principale.
Se si seguono tali regole, sarà possibile utilizzare il MOC su altri thread.
In particolare, quando si utilizza performBlock
, l'API dei dati di base si assicura che il codice sia sincronizzato correttamente.
Grazie. Ho letto che NSManagedObject non è thread-safe. Come dovrei creare nuovi NSManagedObjects su quella coda privata? – jarryd
Grazie per la modifica. Quindi, se NSManageObjects viene aggiunto allo store o modificato dal MOC con concomitanza, non è necessario sincronizzare manualmente lo store? – jarryd
Scusa, non ho seguito quella domanda. –