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.