GCDスケジューリンググループの使用
2712 ワード
単語表
1.dispatch
2. queue
3. sync
4. async
5. DISPATCH_QUEUE_CONCURRENT
6. DISPATCH_QUEUE_SERIAL
シーンの操作
実際の開発では,N個の非同期スレッドを開く必要があるが,後続の操作では,N個のスレッドが返すデータに依存し,すべてのスレッドタスクの実行完了の通知を受信する必要がある.
一般的な使い方
/**
- ,
*/
- (void)group1 {
// 1.
dispatch_group_t group = dispatch_group_create();
// 2.
dispatch_queue_t q = dispatch_get_global_queue(0, 0);
// 3.
dispatch_group_async(group, q, ^{
[NSThread sleepForTimeInterval:1.0];
NSLog(@" 1 %@", [NSThread currentThread]);
});
dispatch_group_async(group, q, ^{
NSLog(@" 2 %@", [NSThread currentThread]);
});
dispatch_group_async(group, q, ^{
NSLog(@" 3 %@", [NSThread currentThread]);
});
// 4.
dispatch_group_notify(group, q, ^{
NSLog(@"OVER %@", [NSThread currentThread]);
});
// 5.
NSLog(@"come here");
}
注意:dispatch_group_notifyこの関数は非同期で、同期に置き換えるにはdispatch_group_wait(group, DISPATCH_TIME_FOREVER).グループは空ではありません.このコードはずっと待っています.次のコードは実行しません.
enter & leavel
dispatch_group_enter(group)関数内部実装原理
端末入力:*man dispatch_group_Enter**連続2つのスペース
void dispatch_group_async(dispatch_group_t group, dispatch_queue_t queue, dispatch_block_t block)
{
dispatch_retain(group);
dispatch_group_enter(group);
dispatch_async(queue, ^{
block();
dispatch_group_leave(group);
dispatch_release(group);
});
}
dispatch_group_leave(group)関数
特殊なシーンでの使用法
- (void)group2 {
//
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
//
dispatch_group_t group = dispatch_group_create();
// 1. , group , block group
// dispatch_group_enter dispatch_group_leave !
dispatch_group_enter(group);
dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:10];
NSLog(@"download A - %@", [NSThread currentThread]);
//
// 2.
dispatch_group_leave(group);
});
dispatch_group_enter(group);
dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:1.0];
NSLog(@"download B - %@", [NSThread currentThread]);
//
// 2.
dispatch_group_leave(group);
});
// , , , ,
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
NSLog(@"OK");
}
注意:同様に最後にグループの通知を待つこともできますが、非同期に変更することもできます.通常の書き方の例を参照してください.