2009-10-29 22 views
16

Quiero configurar una cola de tareas serializada usando NSOperationQueue, pero estoy un poco confundido por la terminología discutida en la documentación.NSOperationQueue y concurrente versus no simultáneo

En el contexto de un objeto NSOperation, los términos concurrentes y no concurrente no necesariamente se refieren a la ejecución de lado a lado de hilos. En cambio, una operación no simultánea es aquella que se ejecuta utilizando el entorno que se proporciona para mientras que una operación simultánea es responsable de configurar su propio entorno de ejecución .

¿Qué significa para configurar "entorno de ejecución propia '?

Mis tareas NSOperation derivados necesidad de ejecutar en serie en el orden en que se añaden a la cola.

Así que pensé que esto implica una operación 'no simultánea' así que implementaría 'main' para el trabajo que necesita completarse y también devolvería NO para 'isConcurrent'. Además, el 'setMaxConcurrentOperationCount' de NSOperationQueue se establecería en 1.

The razón por la cual no estoy configurando la dependencia NSOperation y entre estas tareas es porque el orden en que se insertan en la cola es el orden en que deben completarse.

¿Son estas suposiciones correctas?

Respuesta

23

NSOperationQueue siempre ejecuta operaciones al mismo tiempo, teniendo en cuenta las dependencias.

Una operación "no concurrente" requiere un hilo separado para ejecutarse simultáneamente. NSOperationQueue es responsable de proporcionar este hilo. En otras palabras, una operación no simultánea depende de NSOperationQueue para que sea una operación simultánea.

Una operación "concurrente" es concurrente por sí sola; no necesita NSOperationQueue para crear un hilo para ello. Un ejemplo sería una operación que utiliza un archivo I/O asíncrono.

Si desea ejecutar dos o más operaciones en serie, necesita usar dependencias.

Si desea que una operación bloquee el hilo principal, no utilice NSOperationQueue; simplemente ejecute cada operación una después de la otra en el hilo principal.

Para configurar manualmente máximo de operaciones simultáneas, utilice el método de operationQueue setMaxConcurrentOperationCount:

+9

No necesariamente tienen que utilizar las dependencias si setMaxConcurrentOperationCount en su NSOperationQueue a 1. En mi experiencia, que procesa las operaciones en el orden en que se añaden a la cola. Sin embargo, puede configurar las dependencias solo para estar seguro. –

+10

El documento establece que establecer la cuenta máxima en 1 solo no garantiza la orden FIFO. NSOperationQueue también tiene en cuenta las prioridades y algunas otras cosas para determinar el orden. –

1

¿Realmente necesita la subclase NSOperation? ¿Por qué no simplemente usar NSInvocationOperation y su método addDependency:?

Ver mi respuesta en this SO question.

+0

Así NSInvocationOperation es para tareas ligeras en la creación de una subclase es un exceso .. Pero lo que constituye un "entorno de ejecución propia"? –

+0

Curiosamente, esa redacción no está en la última versión de la documentación (ver enlace a continuación). Creo que la redacción se refiere a cualquier configuración que deba hacer con respecto a la creación de subprocesos. https://developer.apple.com/iphone/biblioteca/documentación/Cacao/Referencia/NSOperation_class/Referencia/reference.html – nall

+0

Esta frase de la documentación más antigua parece relevante: En el método de arranque, debe preparar la operación para su ejecución, que incluye la preparación del entorno de tiempo de ejecución para su operación. (Por ejemplo, si desea crear un hilo a sí mismo, lo haría aquí.) Una vez establecido el entorno de ejecución, puede llamar a cualquier método o funciones que desee iniciar posteriormente su operación. – nall

Cuestiones relacionadas