1.基本介绍:
(1) Grand Central Dispatch (GCD)是Apple开发的一个多核编程的较新的解决方法。在Mac OS X 10.6雪豹中首次推出,并在最近引入到了iOS4.0。
(2) GCD是一个替代诸如NSThread等技术的很高效和强大的技术。GCD完全可以处理诸如数据锁定和资源泄漏等复杂的异步编程问题。(3) 它是IOS多线程抽象层次最高的一层,下面还有前面2章节介绍的更加轻量级的Cocoa operations,和Thread。
2.主要方法:
(1)创建一个队列
dispatch_queue_t queue = dispatch_queue_create("LoadImage", NULL);
其中,第一个参数是标识队列的,第二个参数是用来定义队列的参数(目前不支持,因此传入NULL)。
(2)执行一个队列(async--->异步,sync--->同步)
dispatch_async(queue, ^{ [self doSomething]; });
其中,首先传入之前创建的队列,然后提供由队列运行的代码块。
(3)声明并执行一个队列 (如果不需要保留要运行的队列的引用)
dispatch_async(dispatch_queue_create ("LoadImage", NULL), ^{ [self doSomething]; });
(4)暂停一个队列
dispatch_suspend(queue);
(5)恢复一个队列(如果暂停一个队列不要忘记恢复)
dispatch_resume(queue);
(6)将代码块中的工作转回到主线程(注意,dispatch_suspend (以及dispatch_resume)在主线程上不起作用)
dispatch_sync(dispatch_get_main_queue(), ^{ [self dismissLoginWindow]; });
3.代码示例
- #pragma mark - GCD(Grand Central Dispatch)
- - (void)GCD{
- dispatch_queue_t queue = dispatch_queue_create("test", NULL);
- // 多一个a,异步
- dispatch_async(queue, ^{
- for (int i = 0; i < 100; i++) {
- NSLog(@"--多线程--%d",i);
- }
- // 判断是否是在多线程运行环境
- BOOL isMulti = [NSThread isMultiThreaded];
- NSLog(@"%d",isMulti);
- if (isMulti) {
- NSLog(@"*********多线程***********");
- }
- // 将代码块中的工作转回到主线程
- dispatch_sync(dispatch_get_main_queue(), ^{
- // 判断是否是在主线程运行环境
- BOOL isMain = [NSThread isMainThread];
- if (isMain) {
- NSLog(@"*********主线程**********");
- }
- });
- });
- /* // 通过此方式,还是运行在当前线程
- dispatch_sync(queue, ^{
- // 主线程
- });
- */
- for (int i = 0; i < 100; i++) {
- NSLog(@"--主线程--%d",i);
- }
- }
4.加载网络图片(在多线程加载明显比放在主线程加载快N多)
- #pragma mark - 给UIImageView写一个类目
- @interface UIImageView (WebCach)
- - (void)setImageWithURL:(NSURL *)url;
- @end
- #import "UIImageView+WebCach.h"
- @implementation UIImageView (WebCach)
- - (void)setImageWithURL:(NSURL *)url{
- dispatch_queue_t queue = dispatch_queue_create("loadImage", NULL);
- dispatch_async(queue, ^{
- NSData * data = [NSData dataWithContentsOfURL:url];
- UIImage * image = [UIImage imageWithData:data];
- // 加载UI的操作,一般放在主线程进行
- dispatch_async(dispatch_get_main_queue(), ^{
- self.image = image;
- });
- });
- }
- @end
- - (void)viewDidLoad
- {
- [super viewDidLoad];
- // Do any additional setup after loading the view.
- UIImageView * imageView = [[UIImageView alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];
- [imageView setImageWithURL:[NSURL URLWithString:@"http://www.baidu.com/img/bdlogo.gif"]];
- [self.view addSubview:imageView];
- }