ios cocoa-touch nsoperation grand-central-dispatch

ios - ¿Qué tareas son más adecuadas para NSOperation que GCD?



cocoa-touch grand-central-dispatch (4)

Al parecer, NSOperationQueue se basa en GCD a partir de iOS 4; Los documentos simplemente no se han actualizado. Consulte esta publicación realizada por un empleado de Apple aquí: https://devforums.apple.com/message/352770 (Es posible que deba crear una cuenta) Por lo tanto, debe seguir los consejos de Mike Abdullah y usar la API más sencilla para la tarea en cuestión. dispatch_async es de nivel inferior, generalmente de tipo C (pero no limitado a), y es bueno para transacciones de un solo disparo y de tipo secuencial (active este bloque en esta cola, FTW). Los NSOperationQueues son de nivel superior, cosas de Objective-C, y son buenos si está agregando muchas operaciones en varios puntos de su código y / o necesita administrar la concurrencia, las prioridades y las dependencias. Al menos así es como los uso.

Esta pregunta ya tiene una respuesta aquí:

¿Qué tareas serían más adecuadas para usar NSOperation en lugar de usar GCD al programar para el iPhone?

A mi me parece que hacen lo mismo. No puedo ver las fortalezas y debilidades que uno tiene sobre el otro.


Como siempre con estas preguntas, use la API más simple disponible. Mida si se trata de un problema de rendimiento y luego vuelva a evaluar si es necesario.


Una cosa que no creo que se haya mencionado aquí es que las NSOperation s pueden cancelarse durante la ejecución, mientras que un bloqueo está garantizado para completarse una vez que la ejecución haya comenzado. Dicho esto, una cola GCD se puede suspender ( dispatch_suspend() ), por lo que no se ejecutarán los bloques que siguen a los bloques que se están ejecutando actualmente.


NSOperation se basa en GCD, por lo que la pregunta es más acerca de si usas NSOperation o pasas un bloque directamente a GCD.

Una NSOperation es voluminosa y necesita más códigos de placa de caldera para configurarlo, pero tiene mucha más funcionalidad. Puede crear la misma subclase NSOperation en varias partes de su código y ponerlas en la cola y ejecutarlas.

Pasar un bloque a GCD, por ejemplo, dispatch_async es rápido y desechable. Normalmente no reutiliza un bloque en ningún otro lugar; acaba de configurar un bloque que se ejecuta solo en ese punto del código, lo pasa al GCD u otras API, y continúa rápidamente.

Así que cada uno tiene sus méritos.