GCD

2016-06-29  本文已影响215人  弹一首键盘协奏曲

      在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]);

            });

     });

}

上一篇下一篇

猜你喜欢

热点阅读