六.GCDキューグループ
5477 ワード
一.キュー・グループの基本概念キューグループは、キュー内のタスクを管理するための実行 である.一般使用手順: キューグループ を作成キュー を作成キューグループ非同期関数を使用してタスクをカプセル化し、キューにコミットする 現在のすべてのタスクが実行されている場合を、キューグループの傍受の範囲 に組み入れる.
二.キュー・グループの簡単な使用:リスニング・タスクの完了すべてのタスクが同時に実行されます(シーケンスなし) すべての非同期関数は、キューに追加され、キューグループのリスニング範囲 に組み込まれる.は、 を呼び出す.
三.キューグループと関数ペアキューグループの関数対用法は現在珍しい用法であり、この用法は比較的古いものであり、利点はキューグループに入るタスク を厳格に制御/傍受することである.この方法は非同期関数 しか使用できない.基本手順: まずキューグループ作成関数を使用して、キューグループ を作成します.同時キュー を作成は、キューグループを開き、非同期関数を使用して各タスク をカプセル化する.タスクの実行が終了した後、キュー・グループに追加されたタスクをキュー・グループから削除する(参照カウント管理と同様に、カウント+1はカウント-1を伴う必要がある)+キュー・グループは通常dispatch_group_wait連用、キューグループ内のタスクX秒待ち、その後後続のタスク の実行を継続する
四.キューグループの小さなインスタンスを使用する--2枚の画像をダウンロードし、合成して表示します.
二.キュー・グループの簡単な使用:リスニング・タスクの完了
dispatch_group_notify( , )
の関数を使用して、この関数上のタスクの実行が完了するかどうかを傍受し、タスクが完了すると、この方法 // 1.
dispatch_group_t group = dispatch_group_create();
// 2.
dispatch_queue_t queue = dispatch_queue_create("123", DISPATCH_QUEUE_CONCURRENT);
// 3.
dispatch_group_async(group, queue, ^{
NSLog(@"1---%@", [NSThread currentThread]);
});
dispatch_group_async(group, queue, ^{
NSLog(@"2---%@", [NSThread currentThread]);
});
dispatch_group_async(group, queue, ^{
NSLog(@"3---%@", [NSThread currentThread]);
});
dispatch_group_async(group, queue, ^{
NSLog(@"4---%@", [NSThread currentThread]);
});
// 4.
dispatch_group_notify(group, queue, ^{
NSLog(@" ");
});
三.キューグループと関数ペア
- (void)groupQueue2 {
// 1.
dispatch_group_t group = dispatch_group_create();
// 2.
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
// 3. --
dispatch_group_enter(group);
// 4.
dispatch_async(queue, ^{
NSLog(@"1---%@", [NSThread currentThread]);
// 5. ,
dispatch_group_leave(group);
});
dispatch_group_enter(group);
dispatch_async(queue, ^{
NSLog(@"2---%@", [NSThread currentThread]);
dispatch_group_leave(group);
});
dispatch_group_enter(group);
dispatch_async(queue, ^{
NSLog(@"3---%@", [NSThread currentThread]);
dispatch_group_leave(group);
});
// //
// dispatch_group_notify(group, queue, ^{
// NSLog(@" ");
// });
// , time , , 0, , 0
dispatch_time_t timer = dispatch_time(DISPATCH_TIME_NOW, 0.00000002 * NSEC_PER_SEC);
// tiemr , , , 0,
long n = dispatch_group_wait(group, timer);
NSLog(@"%ld", n);
NSLog(@"----end------");
}
四.キューグループの小さなインスタンスを使用する--2枚の画像をダウンロードし、合成して表示します.
override func touchesBegan(touches: Set, withEvent event: UIEvent?) {
// 1.
let group = dispatch_group_create()
// 2.
let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)
// 3. 1
dispatch_group_async(group, queue) { () -> Void in
// URL
guard let url = NSURL(string: "http://wanzao2.b0.upaiyun.com/system/pictures/33164301/original/1455500488_500x500.png") else {
return
}
// URL
guard let data = NSData(contentsOfURL: url) else {return};
// URL
let image = UIImage(data: data)
self.image1 = image
debugPrint(NSThread.currentThread())
}
// 4. 2
dispatch_group_async(group, queue) { () -> Void in
guard let url = NSURL(string: "http://ww1.sinaimg.cn/large/e389bb44jw1efrld60zctj20cs0bdglv.jpg") else {return}
guard let data = NSData(contentsOfURL: url) else {return}
let image = UIImage(data: data)
self.image2 = image
debugPrint(NSThread.currentThread())
}
// , ,
/*
// 5.1 , , ,
dispatch_barrier_async(queue) { () -> Void in
debugPrint("barrier--------")
}
// 5.2 , UI
dispatch_group_async(group, queue) { () -> Void in
UIGraphicsBeginImageContext(CGSizeMake(200, 200))
self.image1?.drawInRect(CGRectMake(0, 0, 200, 100))
self.image2?.drawInRect(CGRectMake(0, 100, 200, 100))
let image = UIGraphicsGetImageFromCurrentImageContext()
// UI
dispatch_async(dispatch_get_main_queue(), { () -> Void in
self.imageView.image = image
})
}
*/
// 6.1 , , ,
// ,
dispatch_group_notify(group, queue) { () -> Void in
UIGraphicsBeginImageContext(CGSizeMake(200, 200))
self.image1?.drawInRect(CGRectMake(0, 0, 200, 100))
self.image2?.drawInRect(CGRectMake(0, 100, 200, 100))
let image = UIGraphicsGetImageFromCurrentImageContext()
// UI
dispatch_async(dispatch_get_main_queue(), { () -> Void in
self.imageView.image = image
})
}
}