在iOS所有实现多线程的方案中,GCD应该是最有魅力的,因为GCD本身是苹果公司为多核的并行运算提出的解决方案。GCD在工作时会自动利用更多的处理器核心,以充分利用更强大的机器。GCD是Grand Central Dispatch的简称,它是基于C语言的。如果使用GCD,完全由系统管理线程,我们不需要编写线程代码。只需定义想要执行的任务,然后添加到适当的调度队列(dispatch queue)。GCD会负责创建线程和调度你的任务,系统直接提供线程管理
使用GCD的时候有以下几个步骤:
一、创建任务:确定要执行什么操作
二、创建队列:将任务添加到队列中 GCD会将队列里的任务取出,放到对应的线程中去执行
三、选择任务的执行函数:
1.同步的方式执行函数
dispatch_sync(dispatch_queue_t queue, ^(void)block);
参数1:queue是对应的队列
参数2:block是对应的执行任务
2.异步的方式执行函数
dispatch_async(dispatch_queue_t queue, ^(void)block);
参数1:队列
参数2:对应的任务
队列有下面四种
*需要注意的是:主队列中严禁提交同步任务 会导致线程卡死 导致界面假死
主队列 不允许在主线程中提交同步任务,否则会死循环 刷新UI的操作放到主队列中执行
dispatch_queue_t mainQueue = dispatch_get_main_queue();
同步状态:会卡死
异步状态:不会开线程(会在线程闲下来的时候执行提交的任务)
//全局并发队列
dispatch_queue_t globalQueue
=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
同步�状态:不会开线程,顺序执行
异步状态:会开线程,并且乱序执行
//自定义串行
dispatch_queue_t serialQueue=dispatch_queue_create("abc", NULL);
同步状态:不开线程,并且顺序执行
异步状态:开一条线程,顺序执行
//自定义的并行队列
dispatch_queue_t ConcurrentQueue=dispatch_queue_create("abc", DISPATCH_QUEUE_CONCURRENT);
同步状态:不开线程,顺序执行
异步状态:开线程,乱序执行(会开多条线程)
如下方法 来做示例
-(void)threadCommunication{
//创建主队列
dispatch_queue_t mainQueue = dispatch_get_main_queue();
//创建全局并发队列
dispatch_queue_t globalQueue
=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//开启异步任务
dispatch_async(globalQueue, ^{
NSURL *url = [NSURL URLWithString:@"http://v1.qzone.cc/pic/201408/29/17/03/540041ff31605450.jpeg%21600x600.jpg"];
NSData *data= [NSData dataWithContentsOfURL:url];
NSLog(@"全局并发队列=%@",[NSThread currentThread]);
//开启第二个异步任务
dispatch_async(mainQueue, ^{
//这里刷UI《有好东西哦。你懂的》
self.MyImageView.image=[UIImage imageWithData:data];
NSLog(@"主队列=%@",[NSThread currentThread]);
});
});
}