GCDの常用方法のまとめ
4734 ワード
参考記事:http://www.jianshu.com/p/2d57c72016c6
1マルチスレッドを開く方法 Thread:C言語に基づいて、基本的には使われなくなりました.プログラム猿の起動と管理スレッドの宣言周期が必要です. NSThread:Threadのパッケージに基づいて、oc言語は、プログラム猿の起動と管理スレッドの声明周期 が必要です. GCD:NSThreadの代わりに、C言語に基づいて、機能が強く、自動管理スレッドのライフサイクル NSOperation:GCDのパッケージは、oc言語に基づいて、自動管理スレッドのライフサイクルです. 2 GCDの核心概念タスク:同期実行(sync):現在のスレッドでのみタスクを実行でき、新しいスレッドを開く能力を備えていない非同期実行(async):新しいスレッドでタスクを実行でき、新しいスレッドを開く能力を備えている .列:コンカレントDispactch Que:複数のタスクを同時に実行させることができます.同時並行機能は、非同期関数の下でのみ有効なシリアルキューです.タスクを次から次へと実行させます.(一つのタスクを実行した後、次のタスクを実行する) 3 GCDの基本使用
3.1スレッド間通信(サブスレッドがデータをダウンロードし、メインスレッドがUIを更新する)
(1)時間遅延
1マルチスレッドを開く方法
3.1スレッド間通信(サブスレッドがデータをダウンロードし、メインスレッドがUIを更新する)
//1. , ,
dispatch_async(dispatch_get_global_queue(0, 0), ^{
//2.
//2.1 URL
NSURL *url = [NSURL URLWithString:@"https://image.baidu.com"];
//2.2
NSData *data = [NSData dataWithContentsOfURL:url];
//2.3
UIImage *image = [UIImage imageWithData:data];
//
NSLog(@"download---%@",[NSThread currentThread]);
//3. UI
// dispatch_async(dispatch_get_main_queue(), ^{
dispatch_sync(dispatch_get_main_queue(), ^{
self.imageView.image = image;
//
NSLog(@"UI---%@",[NSThread currentThread]);
});
});
3.2 GCD常用関数(1)時間遅延
//1.NStimer
// NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(task) userInfo:nil repeats:YES];
//2.afterDelay
//[self performSelector:@selector(task) withObject:nil afterDelay:2.0];
//3.GCD
//dispatch_queue_t queue = dispatch_get_main_queue();
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)),queue , ^{
NSLog(@"---GCD----%@",[NSThread currentThread]);
});
(2)使い捨てコード(注意:怠惰負荷に書いてはいけません) static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSLog(@"---once----");
});
(3)フェンス関数 // :
dispatch_barrier_async(queue, ^{
NSLog(@"+++++++++++++++++++++++++++");
});
(4)高速反復関数//1.
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//2.
/*
:
: ,
:block
*/
dispatch_apply(10, queue, ^(size_t index) {
NSLog(@"%zd----%@",index,[NSThread currentThread]);
});
(5)キューグループ// :
/*
1
2
*/
-(void)combie
{
//0.
dispatch_group_t group = dispatch_group_create();
//1.
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//2. , 1
dispatch_group_async(group, queue, ^{
NSLog(@"DOWNLOAD1---%@",[NSThread currentThread]);
//2.1 URL
NSURL *url = [NSURL URLWithString:@"http://imgsrc.baidu.com/forum/pic/item/c69ae2003af33a87ecb1c796c65c10385143b585.jpg"];
//2.2
NSData *imageData = [NSData dataWithContentsOfURL:url];
//2.3
self.image1 = [UIImage imageWithData:imageData];
});
//3. , 2
dispatch_group_async(group, queue, ^{
NSLog(@"DOWNLOAD2---%@",[NSThread currentThread]);
//3.1 URL
NSURL *url = [NSURL URLWithString:@"http://s6.sinaimg.cn/middle/6753066ftc67bdde1ca25&690"];
//3.2
NSData *imageData = [NSData dataWithContentsOfURL:url];
//3.3
self.image2 = [UIImage imageWithData:imageData];
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"COMBIE---%@",[NSThread currentThread]);
//4.1
UIGraphicsBeginImageContext(CGSizeMake(200, 200));
//4.2 1
[self.image1 drawInRect:CGRectMake(0, 0, 200, 100)];
//4.3 2
[self.image2 drawInRect:CGRectMake(0, 100, 200, 100)];
//4.4
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
//4.5
UIGraphicsEndImageContext();
//5. , UI
// dispatch_async(dispatch_get_main_queue(), ^{
self.imageView.image = image;
NSLog(@"UI---%@",[NSThread currentThread]);
//});
});