我如何知道Grand Central Dispatch中的所有工作都已完成?
我需要发送多个任务到Grand Central Dispatch运行。 有些任务会先完成,有些则会完成。
我如何知道Grand Central Dispatch中的所有工作都已完成?
我应该使用一个计数器logging完成的任务数量吗? 任何更聪明的方法?
所有任务完成后,您可以使用派遣组来通知。 这是一个来自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"); });
如果你想控制一个任务在最后执行,你可以使用dispatch_group_t。如果你想要一个任务不仅在一些任务之后执行,而且在一些任务之前执行,你可以使用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");});
它可能会打印
12345 or 21354 or ... but 3 always after 1 and 2, and 3 always before 4 and 5
如果你想精确地控制顺序,你可以使用dispatch_sync或者Serial Dispatch Queue或者NSOperationQueue。如果你使用NSOperationQueue,使用“addDependency”方法来控制任务的顺序:
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];
它将始终打印:
op1 op2 op3
你可以在Swift 3中使用DispatchGroup使用GCD来实现这个function。 所有任务完成后,您都可以收到通知。
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") }