grand-central-dispatch nsoperationqueue

grand central dispatch - (iOS) dispatch_async() vs. NSOperationQueue



grand-central-dispatch (4)

Añadiendo a la respuesta anterior, la otra ventaja de la cola de NSOperation sobre GCD es

1) Dependencias: - Podemos configurar una dependencia entre dos operaciones NSO. La operación no comenzará hasta que todas sus dependencias devuelvan verdadero para terminado.

2) Estado de funcionamiento: - Podemos controlar el estado de una operación o cola de operación. Listo, ejecutando o terminado

3) Número máximo de operaciones: - Podemos especificar el número máximo de operaciones en cola que se pueden ejecutar simultáneamente

Aprendí programación iOS gracias al curso CS193p de Stanford (en iTunes U), así como al libro de programación de iOS de Big Nerd Ranch. En ambos casos, recomiendan usar dispatch_async() , dispatch_get_main_queue() , etc. para manejar el enhebrado y las operaciones simultáneas. Sin embargo, en la sesión de la WWDC 2012 sobre la construcción de IU concurrente, el orador recomendó el uso de NSOperationQueue .

¿Cuáles son las diferencias entre dispatch_*() y NSOperationQueue , y existe alguna razón (técnica, de rendimiento, estilística u otra) que deba usar una sobre otra? ¿ NSOperationQueue es solo un contenedor Objective-C alrededor de dispatch_async , o hay algo más que eso?


Ambos hacen lo mismo, pero la principal diferencia entre ellos es que: podemos cancelar la tarea si queremos utilizar NSOperation, mientras que si utilizamos GCD, una vez que asignamos la tarea a la cola, no podemos cancelarla.


NSOperationQueue pesa mucho más que dispatch_async (), solo se basa en GCD de una forma muy limitada (esencialmente solo utiliza la cola de despacho global para ejecutar sus operaciones asincrónicas pero, por lo demás, no utiliza otras instalaciones GCD).

NSOperationQueue tiene capacidades adicionales no proporcionadas por GCD, pero si no las necesita, usar GCD le dará un mejor rendimiento.


NSOperation* clases NSOperation* son la API de nivel superior. Ocultan la API de menor nivel de GCD para que puedas concentrarte en completar la tarea.

La regla general es: primero use la API del nivel más alto y luego la degrade según lo que necesite lograr.

La ventaja de este enfoque es que su código permanece más agnóstico a la implementación específica que proporciona el proveedor. En este ejemplo, usando NSOperation , utilizará la implementación de cola de ejecución de Apple (usando GCD). Si Apple alguna vez decide cambiar los detalles de la implementación detrás de escena, puede hacerlo sin romper el código de su aplicación.
Un ejemplo sería Apple desaprobando GCD y utilizando una biblioteca completamente diferente (que es poco probable porque Apple creó GCD y parece que a todos les encanta).

Respecto al asunto, recomiendo consultar los siguientes recursos:

Ahora, con respecto a sus preguntas específicas:

¿Cuáles son las diferencias entre dispatch _ * () y NSOperationQueue, [...]

Véase más arriba.

[...] ¿y hay alguna razón (técnica, de rendimiento, estilística u otra) que deba usar una sobre la otra?

Si el material de NSOperation hace su trabajo, NSOperation .

¿NSOperationQueue es solo un contenedor Objective-C alrededor de dispatch_async, o hay algo más que eso?

Sí, básicamente es así. Además de características como dependencias de operación, inicio / detención fáciles.

Enmienda

Decir que usar el api de nivel más alto primero puede sonar intrigante. Por supuesto, si necesita una forma rápida de ejecutar código en un hilo específico, no desea escribir un montón de código repetitivo que hace que el uso de funciones C de nivel inferior sea perfectamente válido:

dispatch_async(dispatch_get_main_queue(), ^{ do_something(); });

Pero considera esto:

[[NSOperationQueue mainQueue] addOperationWithBlock:^{ do_something(); }];

Recomendaría este último porque la mayoría de lo que escribirás es Objective-C de todos modos, ¿por qué no abrazar su expresividad?