Sto iniziando a pensare che la risposta alla mia domanda sia "No", ma sono ancora confuso e incerto su questo. Quindi per favore conferma. Ho già imparato la necessità di fare attenzione quando si utilizzano i dati di base con più thread. Gli oggetti NSManagedObjectContext non devono superare i limiti del thread. Essendo un principiante con entrambi i thread e Core Data, ho felicemente scoperto che GCD dovrebbe rendere questo più facile.Una coda di invio GCD è sufficiente per limitare un contesto Core Data a un singolo thread
Ingenuamente forse, ho quindi pensato di creare semplicemente una coda di distribuzione GCD dedicata per gestire i dati di base (o anche, se necessario, disporre di più code di invio ciascuna con il proprio contesto di dati di base). Sarebbe stato semplice.
Ma ora mi rendo conto che un grande vantaggio delle code di invio GCD è che gestisce e utilizza più thread in base alle esigenze. Quindi, se ho capito bene, i compiti che ho consegnato alla stessa coda di invio, potrebbero finire per essere eseguiti in thread diversi, potenziando potenzialmente un contesto di dati di base da un thread a un altro, e fare in modo che le cose vadano storte. È giusto?
Ho letto molte domande e risposte correlate, ad esempio Core Data and threads/Grand Central Dispatch, ma rimango un po 'confuso. La risposta accettata a questa domanda, utilizzando le code GCD, garantisce che venga creato un nuovo contesto su ciascun thread, ma non sottolinea la necessità di farlo. Un'altra risposta dice "Potresti eseguire tutto il lavoro di CoreData su una coda denominata com.yourcompany.appname.dataaccess" sembra implicare che finché il lavoro di Core Data è limitato a una coda di invio GCD, allora tutto è OK. Forse non lo è.
Ottima risposta, ma nel thread collegato, la confusione di bbum sembra implicare che l'oggetto MOC non può attraversare i limiti del thread, anche se l'accesso è serializzato. Ben lo afferma in modo specifico, quindi cosa dovremmo fare? –
@SedateAlien, all'inizio della sua risposta, Ben indica la nota nella [documentazione] (http://tinyurl.com/6dlg75j) che dice: *** Nota: ** È possibile utilizzare thread, code di operazioni seriali o code di invio per concorrenza. Per motivi di concisione, questo articolo usa "thread" in tutto per riferirsi a uno di questi. "* Quindi, nel resto della sua risposta, o nella documentazione, è possibile sostituire * la coda di invio seriale * per * thread *. , la cosa essenziale è evitare di usare contemporaneamente lo stesso contesto per cose diverse.Tutti i tre meccanismi menzionati possono essere utilizzati per ottenere ciò.Impostazione – Caleb
Quindi devo creare il MOC su detta coda seriale? Se creo l'oggetto MOC fuori coda, ma usarlo solo in coda, è accettabile o richiede problemi? –