poner pasar musica gratis con como apple agregar ios core-data thread-safety grand-central-dispatch

ios - pasar - Es una cola de despacho de GCD suficiente para limitar un contexto de Datos Core a un solo hilo



como pasar musica al iphone con itunes (2)

Estoy empezando a pensar que la respuesta a mi pregunta es ''No'', pero todavía estoy confundido e inseguro sobre esto. Entonces por favor confirme. Ya aprendí la necesidad de tener cuidado al usar Core Data con múltiples hilos. Los objetos NSManagedObjectContext no deben cruzar límites de subprocesos. Siendo un novato con ambos hilos y Core Data, felizmente encontré que GCD debería facilitar algo de esto.

Ingenuamente quizás, entonces pensé que simplemente crearía una cola dedicada de despacho de GCD para tratar con los datos centrales (o incluso, si fuera necesario, tendría múltiples colas de despacho cada una con su propio contexto de datos centrales). Eso hubiera sido simple.

Pero ahora me doy cuenta de que una gran ventaja de las colas de distribución de GCD es que gestiona y utiliza múltiples hilos según sea necesario. Por lo tanto, si entiendo este derecho, las tareas que transfiero a la misma cola de distribución pueden terminar ejecutándose en diferentes subprocesos, potencialmente transmitiendo un contexto de datos centrales de un hilo a otro y haciendo que las cosas salgan mal. ¿Está bien?

He leído muchas preguntas y respuestas relacionadas, por ejemplo, Datos principales e hilos / Despacho de Grand Central , pero sigo algo confundido. La respuesta aceptada a esa pregunta, usando colas GCD, asegura que se crea un nuevo contexto en cada hilo, pero no señala la necesidad de hacerlo. Otra respuesta dice "Se puede ejecutar todo el trabajo de CoreData en una cola llamada com.yourcompany.appname.dataaccess", lo que implica que mientras todo el trabajo de Core Data se limite a una cola de despacho de GCD, todo estará bien. Tal vez no lo es.


AFAIK estás en lo correcto; GCD no ofrece garantías sobre el hilo en el que se ejecuta la cola. Los bloques y las llamadas a función enviadas a la cola se ejecutarán uno a la vez, pero si Core Data hace algo con el hilo actual, por ejemplo, instala una fuente de bucle de ejecución u observador, probablemente las cosas no funcionarán como se esperaba.

Sin embargo, en Mac OS X 10.7, NSManagedObjectContext puede configurarse para ejecutarse en el hilo principal, en un hilo separado o en una cola privada.


Actualización: como señala @adib en un comentario, el enfoque del acceso serializado al contexto del objeto administrado ha cambiado en iOS 9 y MacOS X 10.11. NSConfinementConcurrencyType , la estrategia de confinamiento de subprocesos, ahora está en desuso en favor de NSPrivateQueueConcurrencyType y NSMainQueueConcurrencyType . En otras palabras, deje de usar subprocesos para el acceso simultáneo a los objetos de Datos centrales y, en su lugar, comience a usar GCD. Debería usar la cola de envío principal o la asociada con el MOC, dependiendo de cómo configure el MOC, y no una cola de su propia creación. Esto es fácil de hacer utilizando los métodos -performBlock: o -performBlockAndWait: .

Respuesta corta: el uso de una cola de despacho en serie puede proporcionar acceso serializado a un contexto de objeto administrado, y esa es una forma aceptable de implementar la estrategia de "confinamiento de subprocesos", aunque GCD en realidad puede emplear múltiples subprocesos.

Respuesta más larga:

La respuesta aceptada a esa pregunta, usando colas GCD, asegura que se crea un nuevo contexto en cada hilo, pero no señala la necesidad de hacerlo.

Lo más importante que debe recordar es que debe evitar modificar el contexto del objeto gestionado desde dos subprocesos diferentes al mismo tiempo . Eso podría poner el contexto en un estado inconsistente, y nada bueno puede salir de eso. Por lo tanto, el tipo de cola de envío que utiliza es importante: una cola de despacho concurrente permitiría que varias tareas procedan de manera simultánea, y si ambas usan el mismo contexto, usted tendrá problemas. Si utiliza una cola de despacho en serie, por otro lado, dos o más tareas pueden ejecutarse en diferentes subprocesos, pero las tareas se ejecutarán en orden y solo se ejecutará una tarea a la vez. Esto es muy similar a ejecutar todas las tareas en el mismo hilo, al menos en lo que se refiere a mantener la coherencia del contexto.

Vea esta pregunta y respuesta para una explicación mucho más detallada.

Así es como Core Data siempre ha funcionado. La sección Concurrencia con datos centrales de la Guía de programación de datos básicos brinda consejos sobre cómo proceder si decide usar un único contexto en múltiples hilos. Se trata principalmente de la necesidad de tener mucho cuidado para bloquear el contexto cada vez que accede a él. El objetivo de todo ese bloqueo, sin embargo, es garantizar que dos o más hilos no intenten usar el contexto simultáneamente. El uso de una cola de despacho serializada logra el mismo objetivo: dado que solo una tarea en la cola se ejecuta a la vez, no hay posibilidad de que dos o más tareas intenten usar el contexto al mismo tiempo.