二、基本使用 
1.问题  
任务1和任务2是在主线程执行还是子线程执行,还是单独再开启一个新的线程? 
复制代码 代码如下: 
 
// 
//  YYViewController.m 
//  13-GCD基本使用(问题) 
// 
//  Created by 孔医己 on 14-6-25. 
//  Copyright (c) 2014年 itcast. All rights reserved. 
// 
#import "YYViewController.h" 
@interface YYViewController () 
@end 
 
复制代码 代码如下: 
 
@implementation YYViewController 
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    //开启一个后台线程,调用执行test方法 
    [self performSelectorInBackground:@selector(test) withObject:nil]; 
} 
-(void)test 
{ 
    NSLog(@"当前线程---%@",[NSThread currentThread]); 
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
     
    //异步函数 
    dispatch_async(queue, ^{ 
        NSLog(@"任务1所在的线程----%@",[NSThread currentThread]); 
    }); 
     
    //同步函数 
    dispatch_sync(queue, ^{ 
        NSLog(@"任务2所在的线程----%@",[NSThread currentThread]); 
    }); 
} 
@end 
 
打印结果: 
2015122893339402.png (832×62) 
2.开启子线程,加载图片 
复制代码 代码如下: 
 
// 
//  YYViewController.m 
//  14-GCD基本使用(下载图片) 
// 
//  Created by 孔医己 on 14-6-25. 
//  Copyright (c) 2014年 itcast. All rights reserved. 
// 
#import "YYViewController.h" 
@interface YYViewController () 
@property (weak, nonatomic) IBOutlet UIImageView *imageView; 
@end 
 
复制代码 代码如下: 
 
@implementation YYViewController 
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
     
} 
//当手指触摸屏幕的时候,从网络上下载一张图片到控制器的view上显示 
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
     
    //1.获取一个全局串行队列 
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
    //2.把任务添加到队列中执行 
    dispatch_async(queue, ^{ 
         
        //打印当前线程 
        NSLog(@"%@",[NSThread currentThread]); 
      //3.从网络上下载图片 
        NSURL *urlstr=[NSURL URLWithString:@"http://h.hiphotos.baidu.com/baike/w%3D268/sign=30b3fb747b310a55c424d9f28f444387/1e30e924b899a9018b8d3ab11f950a7b0308f5f9.jpg"]; 
        NSData *data=[NSData dataWithContentsOfURL:urlstr]; 
        UIImage *image=[UIImage imageWithData:data]; 
        //提示 
        NSLog(@"图片加载完毕"); 
         
        //4.回到主线程,展示图片 
        [self.imageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:NO]; 
    }); 
} 
@end 
 
显示效果: 
2015122893357380.png (348×532) 
汽车修理设备出口,给您支招! 【点击进入】 
汽车整套设备出口,整套设备国外建修理厂 汽车修理国外建修理厂咨询:021-59159353 
查 看 
 
打印结果: 
2015122893413566.png (816×65) 
要求使用GCD的方式,在子线程加载图片完毕后,主线程拿到加载的image刷新UI界面。 
复制代码 代码如下: 
 
// 
//  YYViewController.m 
//  14-GCD基本使用(下载图片) 
// 
//  Created by 孔医己 on 14-6-25. 
//  Copyright (c) 2014年 itcast. All rights reserved. 
// 
#import "YYViewController.h" 
@interface YYViewController () 
@property (weak, nonatomic) IBOutlet UIImageView *imageView; 
@end 
 
复制代码 代码如下: 
 
@implementation YYViewController 
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
     
} 
//当手指触摸屏幕的时候,从网络上下载一张图片到控制器的view上显示 
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
     
    //1.获取一个全局串行队列 
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
    //2.把任务添加到队列中执行 
    dispatch_async(queue, ^{ 
         
        //打印当前线程 
        NSLog(@"%@",[NSThread currentThread]); 
      //3.从网络上下载图片 
        NSURL *urlstr=[NSURL URLWithString:@"http://h.hiphotos.baidu.com/baike/w%3D268/sign=30b3fb747b310a55c424d9f28f444387/1e30e924b899a9018b8d3ab11f950a7b0308f5f9.jpg"]; 
        NSData *data=[NSData dataWithContentsOfURL:urlstr]; 
        UIImage *image=[UIImage imageWithData:data]; 
        //提示 
        NSLog(@"图片加载完毕"); 
         
        //4.回到主线程,展示图片 
//        [self.imageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:NO]; 
        dispatch_async(dispatch_get_main_queue(), ^{ 
            self.imageView.image=image; 
            //打印当前线程 
            NSLog(@"%@",[NSThread currentThread]); 
        }); 
    }); 
} 
@end 
 
打印结果: 
2015122893433477.png (805×75) 
好处:子线程中得所有数据都可以直接拿到主线程中使用,更加的方便和直观。 
  
三、线程间通信 
从子线程回到主线程 
复制代码 代码如下: 
 
dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
// 执⾏耗时的异步操作... 
dispatch_async(dispatch_get_main_queue(), ^{ 
// 回到主线程,执⾏UI刷新操作 
}); 
}); 
 |   
        
 
    
    
    
     
 
 |