2012-03-09 11 views
9

Necesito enviar múltiples tareas a Grand Central Dispatch para que se ejecute. Algunas tareas terminarán primero, mientras que otras terminarán la última.¿Cómo sé que terminaron todas mis tareas en Grand Central Dispatch?

¿Cómo sé que terminaron todas mis tareas en Grand Central Dispatch?

¿Debo usar un contador para registrar el número de tareas finalizadas? ¿Algún método más inteligente?

Respuesta

22

Puede usar grupos de despacho para recibir notificaciones cuando se completen todas las tareas. Este es un ejemplo de http://cocoasamurai.blogspot.com/2009/09/guide-to-blocks-grand-central-dispatch.html

dispatch_queue_t queue = dispatch_get_global_queue(0,0); 
dispatch_group_t group = dispatch_group_create(); 

dispatch_group_async(group,queue,^{ 
    NSLog(@"Block 1"); 
}); 

dispatch_group_async(group,queue,^{ 
    NSLog(@"Block 2"); 
}); 

dispatch_group_notify(group,queue,^{ 
    NSLog(@"Final block is executed last after 1 and 2"); 
}); 
+0

Gracias. ¿Admite iOS esta característica? – user403015

+0

Dev-Guide sais "Disponible en iOS 4.0 y versiones posteriores". (https://developer.apple.com/library/ios/#documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html#//apple_ref/doc/uid/TP40008079) –

+0

Muchas gracias. – user403015

3

Si desea controlar una tarea a ejecutar al final, puede utilizar dispatch_group_t, si usted quiere una tarea no sólo para ejecutar después de algunas tareas, sino también para ejecutar antes de algunas tareas , puede utilizar dispatch_barrier_sync:

dispatch_queue_t queue = dispatch_queue_create("com.example.gcd", DISPATCH_QUEUE_CONCURRENT); 

dispatch_async(queue, ^{ printf("1");}); 

dispatch_async(queue, ^{ printf("2");}); 

dispatch_barrier_sync(queue, ^{ printf("3");}); 

dispatch_async(queue, ^{ printf("4");}); 

dispatch_async(queue, ^{ printf("5");}); 

se puede imprimir

12345 or 21354 or ... but 3 always after 1 and 2, and 3 always before 4 and 5 

Si usted quiere controlar el orden exactamente, puede utilizar dispatch_sync o Dispat de serie ch cola, o NSOperationQueue.If utiliza NSOperationQueue, utilizan el método de "addDependency" para controlar el orden de las tareas:

NSOperationQueue *queue = [[NSOperationQueue alloc] init]; 

NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{ 
    NSLog(@"op 1"); 
}]; 

NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{ 
    NSLog(@"op 2"); 
}]; 

NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{ 
    NSLog(@"op 3"); 
}]; 

//op3 is executed last after op2,op2 after op1  
[op2 addDependency:op1]; 
[op3 addDependency:op2]; 

[queue addOperation:op1]; 
[queue addOperation:op2]; 
[[NSOperationQueue mainQueue] addOperation:op3]; 

Será siempre de impresión:

op1 op2 op3 
1

Usted puede lograr esto mediante GCD utilizando DispatchGroup en swift 3. Puede recibir una notificación cuando finalicen todas las tareas.

let group = DispatchGroup() 

    group.enter() 
    run(after: 6) { 
     print(" 6 seconds") 
     group.leave() 
    } 

    group.enter() 
    run(after: 4) { 
     print(" 4 seconds") 
     group.leave() 
    } 

    group.enter() 
    run(after: 2) { 
     print(" 2 seconds") 
     group.leave() 
    } 

    group.enter() 
    run(after: 1) { 
     print(" 1 second") 
     group.leave() 
    } 


    group.notify(queue: DispatchQueue.global(qos: .background)) { 
     print("All async calls completed") 
} 
Cuestiones relacionadas