2012-03-09 16 views
9

Grand Central Dispatchに複数のタスクを送信して実行する必要があります。いくつかのタスクは最初に終了し、いくつかは最後に完了します。Grand Central Dispatchのすべてのタスクが完了したことをどのように知ることができますか?

Grand Central Dispatchのすべてのタスクが完了したことをどのように知ることができますか?

終了したタスクの数を記録するためにカウンタを使用する必要がありますか?よりスマートな方法?

答えて

22

すべてのタスクが完了したときに通知されるディスパッチグループを使用できます。これは、あなたが最後に実行するために一つのタスクを制御したい場合は、あなたがdispatch_group_tを使用することができます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

ありがとうございました。 iOSはこの機能をサポートしていますか? – user403015

+0

Dev-Guide sais「iOS 4.0以降で利用可能」 (https://developer.apple.com/library/ios/#documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html#//apple_ref/doc/uid/TP40008079) –

+0

ありがとうございました。 – user403015

3

の例である、あなたは一つのタスクをしたい場合は、いくつかのタスクの後に実行するだけでなく、いくつかのタスクの前に実行するだけでなく、 、あなたは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");}); 

をご希望を正確に、あなたがdispatch_syncまたはシリアルDispatを使用することができます順序を制御する場合、それは

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

を印刷することができます

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 
1

あなたはこの使用GCDを達成することができますが、NSOperationQueueを使用CHキュー、またはNSOperationQueue.Ifは、タスクの順序を制御するために、「addDependency」の方法を使用しますDispatchGroupswift 3を使用してください。すべてのタスクが完了したら通知を受け取ることができます。

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") 
} 
関連する問題