异步执行任务
- (void)gcdDemo1 {
// 1. 全局队列dispatch_queue_tq = dispatch_get_global_queue(0,0);
// 2. 任务void(^task)() = ^ {NSLog(@"%@", [NSThreadcurrentThread]);
};
// 3. 指定执行任务的函数// 异步执行任务 - 新建线程,在新线程执行task
dispatch_async(q, task);NSLog(@"come here");}
注意:如果等待时间长一些,会发现线程的number发生变化,由此可以推断gcd 底层线程池的工作
同步执行任务
- (void)gcdDemo1 {
// 1. 全局队列dispatch_queue_tq = dispatch_get_global_queue(0,0);
// 2. 任务void(^task)() = ^ {NSLog(@"%@", [NSThreadcurrentThread]);
};
// 3. 指定执行任务的函数
// 同步执行任务 - 不开启线程,在当前线程执行 task
dispatch_sync(q, task);
NSLog(@"come here");
}
精简代码
- (void)gcdDemo2 {for(inti =0; i <10; ++i){dispatch_async(dispatch_get_global_queue(0,0), ^{
NSLog(@"%@ %@", [NSThreadcurrentThread],@"hello");
});
}
}
与NSThread的对比
所有的代码写在一起的,让代码更加简单,易于阅读和维护
NSThread通过@selector指定要执行的方法,代码分散
GCD通过block指定要执行的代码,代码集中
使用GCD不需要管理线程的创建/销毁/复用的过程!程序员不用关心线程的生命周期
如果要开多个线程NSThread必须实例化多个线程对象
NSThread靠NSObject的分类方法实现的线程间通讯,GCD靠block
线程间通讯
- (void)gcdDemo3 {dispatch_async(dispatch_get_global_queue(0,0), ^{
NSLog(@"耗时操作 %@", [NSThreadcurrentThread]);
// 耗时操作之后,更新
UIdispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"更新 UI %@", [NSThreadcurrentThread]);
});
});
}
以上代码是GCD最常用代码组合!
如果要在更新 UI 之后,继续做些事情,可以使用以下代码
- (void)gcdDemo4 {dispatch_async(dispatch_get_global_queue(0,0), ^{
NSLog(@"耗时操作");
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"更新UI");
});
NSLog(@"更新UI完毕");
});
}
网络下载图片
- (void)viewDidLoad {
[superviewDidLoad];
dispatch_async(dispatch_get_global_queue(0,0), ^{
NSLog(@"%s %@", __FUNCTION__, [NSThreadcurrentThread]);
// 1. 异步下载网络图片NSURL*url = [NSURLURLWithString:@"http://f.hiphotos.baidu.com/image/pic/item/1f178a82b9014a901bef674aaa773912b21bee70.jpg"];
NSData*data = [NSDatadataWithContentsOfURL:url];UIImage*image = [UIImageimageWithData:data];
// 2. 完成后更新 UIdispatch_async(dispatch_get_main_queue(),^{
self.imageView.image= image;
[self.imageViewsizeToFit];
self.scrollView.contentSize= image.size;
});
});
}