telegrama tareas significa servicios retencion que modelo ley lct laboral comercial codigo civil art ios queue grand-central-dispatch

ios - significa - Cómo detener/cancelar/suspender/reanudar tareas en la cola GCD



retencion de tareas ley (2)

Cómo detener / cancelar / suspender / reanudar tareas en la cola GCD

¿Cómo se detienen las operaciones de cola en segundo plano? Quiero detener algunas pantallas en nuestra aplicación. Y algunas pantallas debería ser auto reanudar. Entonces, ¿cómo se pasa una cola en iOS?

Quiero decir que cuando el usuario ha navegado el tiempo de la aplicación, ejecutamos el subproceso de fondo en dispatch_queue_t. Pero nunca se detiene y se reanuda en el código. Entonces, ¿cómo se suspende y se reanuda una cola?


No se puede pausar / cancelar cuando se usa una cola GCD. Si necesita esa funcionalidad (y en muchos casos generales, incluso si no la necesita), debe utilizar la API de nivel superior - NSOperationQueue . Esto se construye sobre GCD pero le brinda la capacidad de controlar la cantidad de cosas que se ejecutan al mismo tiempo, suspender el procesamiento de la cola y cancelar operaciones individuales / todas.


Para suspender una cola de envío, es simplemente dispatch_suspend(queue) en Objective-C o Swift 2.3, o queue.suspend() en Swift 3. Eso no afecta a las tareas que se ejecutan actualmente, sino que simplemente evita que se queue.suspend() nuevas tareas en esa cola . Además, obviamente solo suspende las colas que creó (no las colas globales, ni la cola principal).

Para reanudar una cola de despacho, es dispatch_resume(queue) en Objective-C o Swift 2.3, o queue.resume() en Swift 3. No hay concepto de "auto resume", por lo que solo tendrá que reanudarlo manualmente cuando sea apropiado .

Para pasar una cola de despacho, simplemente pase el objeto dispatch_queue_t que creó cuando llamó a dispatch_queue_create() en Objective-C o Swift 2.3, o, en Swift 3, el objeto DispatchQueue que crea con DispatchQueue(label:) .

En cuanto a la cancelación de tareas en cola en las colas de envío, esta es una nueva característica de iOS 8 y llamaría dispatch_block_cancel(block) con su objeto dispatch_block_t en Objective-C o Swift 2.3, o item.cancel() de DispatchWorkItem en Swift 3. Esto cancela los bloques / elementos en cola que no se han iniciado, pero no detiene los que están en curso. Si desea poder interrumpir un bloque / artículo enviado, debe examinar periódicamente dispatch_block_testcancel() en Objective-C y Swift 2.3, o item.isCancelled en Swift 3.

La cancelación de los bloques GCD es lo suficientemente complicada como para que pueda remitirle al video de la WWDC 2014 Potencia, rendimiento y diagnóstico: Novedades en GCD y XPC , que le presenta el concepto de enviar objetos en bloque, ponerlos en cola, cancelarlos, etc. Si bien esto describe la antigua API de Objective-C y Swift 2.3, todos los conceptos son igualmente aplicables a la nueva API de Swift 3.

Si desea cancelar tareas, también puede considerar el uso de colas de operaciones, NSOperationQueue en Objective-C o Swift 2.3, también conocido como OperationQueue en Swift 3, ya que sus operaciones cancelables han existido por un tiempo y es probable que encuentre muchos ejemplos. en línea. También admite la restricción del grado de concurrencia con maxConcurrentOperationCount (mientras que con las colas de envío solo puede elegir entre serie y concurrente, y controlar la concurrencia más que eso requiere un poco de esfuerzo por su parte).

Si utiliza colas de operaciones, puede suspender y reanudar cambiando la propiedad suspended de la cola. Y para pasarlo, solo debes pasar el objeto NSOperationQueue que NSOperationQueue .

Habiendo dicho todo eso, sugeriría que amplíe su pregunta para elaborar qué tipo de tareas se ejecutan en segundo plano y explique por qué quiere suspenderlas. Puede haber mejores enfoques que suspender la cola de fondo.

En sus comentarios, menciona que estaba usando NSTimer , también conocido como Timer en Swift 3. Si desea detener un temporizador, llame a timer.invalidate() para detenerlo. Cree un nuevo NSTimer cuando desee iniciarlo de nuevo.

O si el temporizador realmente se está ejecutando en un subproceso en segundo plano, los temporizadores GCD lo hacen con mucha más gracia, evitando la tontería de la necesidad de crear un runloop en un subproceso en segundo plano, que necesita ejecutar NSTimer en los NSTimer en segundo plano. Con un temporizador GCD, puede suspenderlo / reanudarlo de la misma manera que suspende / reanudar una cola, simplemente utilizando el objeto temporizador en lugar del objeto de cola.