Colas de envío: cómo saber si se están ejecutando y cómo detenerlas

Solo estoy jugando con GCD y he escrito una aplicación CoinFlipper de juguete.

Aquí está el método que voltea las monedas:

- (void)flipCoins:(NSUInteger)nFlips{

    // Create the queues for work
    dispatch_queue_t mainQueue = dispatch_get_main_queue();
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, NULL);

    // Split the number of flips into whole chunks of kChunkSize and the remainder.
    NSUInteger numberOfWholeChunks = nFlips / kChunkSize;
    NSUInteger numberOfRemainingFlips = nFlips - numberOfWholeChunks * kChunkSize;

    if (numberOfWholeChunks > 0) {
        for (NSUInteger index = 0; index < numberOfWholeChunks; index++) {
            dispatch_async(queue, ^{
                NSUInteger h = 0;
                NSUInteger t = 0;
                flipTheCoins(kChunkSize, &h, &t);
                dispatch_async(mainQueue, ^{
                    self.nHeads += h;
                    self.nTails += t;
                });
            });
        }
    }
    if (numberOfRemainingFlips > 0) {
        dispatch_async(queue, ^{
            NSUInteger h = 0;
            NSUInteger t = 0;
            flipTheCoins(numberOfRemainingFlips, &h, &t);
            dispatch_async(mainQueue, ^{
                self.nHeads += h;
                self.nTails += t;
            });
        });

    }
}

Como puedes ver; Estoy dividiendo la cantidad de vueltas en grandes porciones, moviéndolas en segundo plano y actualizando las propiedades en la cola principal. El controlador de la ventana está observando las propiedades y se actualiza una interfaz de usuario con los resultados en ejecución.

He revisado la Guía de programación de concurrencia y los documentos de GCD, y aunque hay una forma de suspender una cola, no hay una forma de detenerlos y eliminar todos los objetos en cola y no en ejecución.

Me gustaría poder enganchar un botón 'detener' para cancelar la inversión una vez que se inicia. ConNSOperationQueue Puedo observar eloperationCount propiedad para saber si se está ejecutando, ycancelAllOperations para eliminar los bloques en cola.

He revisado la Guía de programación de concurrencia y los documentos de GCD, y aunque hay una forma de suspender una cola, no hay una forma de detenerlos y eliminar todos los objetos en cola y no en ejecución.

Asi que :-

¿Cómo puedo saber si los bloques que he agregado a una cola todavía están esperando?¿Cómo cancelo bloques que aún no se han ejecutado?Soy nuevo en las cosas de GCD, así que lo estoy haciendo bien?

Respuestas a la pregunta(3)

Su respuesta a la pregunta