ios swift grand-central-dispatch nsoperationqueue ui-thread

ios - OperationQueue.main vs DispatchQueue.main



swift grand-central-dispatch (3)

Cuando necesite realizar algo en el subproceso principal en el bloque de finalización de una tarea de red o una operación, ¿cuál de estas formas sería más apropiada y por qué ?:

  • OperationQueue.main.addOperation
  • DispatchQueue.main.async

DispatchQueue gestiona la ejecución de elementos de trabajo. Cada elemento de trabajo enviado a una cola se procesa en un conjunto de subprocesos gestionados por el sistema.

Referencia: Apple Doc

La clase NSOperationQueue regula la ejecución de un conjunto de objetos de operación. Después de agregarse a una cola, una operación permanece en esa cola hasta que se cancele explícitamente o termine de ejecutar su tarea. Las operaciones dentro de la cola (pero que aún no se ejecutan) se organizan según los niveles de prioridad y las dependencias de los objetos entre operaciones y se ejecutan en consecuencia. Una aplicación puede crear múltiples colas de operaciones y enviar operaciones a cualquiera de ellas.

Referencia: Apple Doc

Por lo tanto, debería preferir DispatchQueue.main.async cuando desee realizar algo en el hilo principal desde el bloqueo de finalización de cualquier llamada de red. ¡Especialmente cuando está relacionado con las UI Updates ! Y si su tarea es compleja, quiero decir que si necesita una operación adicional en la tarea en ejecución, puede utilizar OperationQueue.main.addOperation contrario, DispatchQueue.main.async le dará un rendimiento más óptimo en comparación.


Para obtener detalles sobre las diferencias entre los dos tipos de cola, vea la respuesta de Lion.

Ambos enfoques funcionarán. Sin embargo, la NSOperation es más necesaria cuando se requiere una programación más avanzada (incluidas las dependencias , la cancelación , etc.). Así que en este caso, un simple

DispatchQueue.main.async { /* do work */ }

estará bien Eso sería equivalente a

dispatch_async(dispatch_get_main_queue(), ^{ /* do work */ });

en Objective-C, que es también cómo lo haría en ese idioma.


Cuándo usar NSOperation

La API de NSOperation es excelente para encapsular bloques de funcionalidad bien definidos. Por ejemplo, podría usar una subclase NSOperation para encapsular la secuencia de inicio de sesión de una aplicación.

La gestión de la dependencia es la guinda del pastel. Una operación puede tener dependencias a otras operaciones y esa es una característica poderosa que carece de Grand Central Dispatch. Si necesita realizar varias tareas en un orden específico, entonces las operaciones son una buena solución.

Puede exagerar las operaciones si está creando docenas de operaciones en un corto período de tiempo. Esto puede llevar a problemas de rendimiento debido a la sobrecarga inherente a la NSOperation API .

Cuándo usar Grand Central Dispatch

Grand Central Dispatch es ideal si solo necesita enviar un bloque de código a una cola en serie o concurrente.

Si no desea pasar por la molestia de crear una NSOperation subclass para una tarea trivial, Grand Central Dispatch es una excelente alternativa. Otro beneficio de Grand Central Dispatch es que puede mantener juntos el código relacionado. Echa un vistazo al siguiente ejemplo.

let dataTask = session.dataTaskWithRequest(request, completionHandler: { (data, response, error) -> Void in // Process Response ... dispatch_async(dispatch_get_main_queue(), { () -> Void in // Update User Interface ... }) })

En el controlador de finalización de la tarea de datos, procesamos la respuesta y actualizamos la interfaz de usuario enviando un cierre (o bloque) a la cola principal. Esto es necesario porque no sabemos en qué hilo se ejecuta el controlador de finalización y lo más probable es que sea un hilo de fondo.

Citado textualmente de esta fuente.