GCD多线程

原创 2016年06月01日 20:18:30

GCD是苹果开发的一种多核编程技术 主要用于优化应用程序以支持多核处理器以及其他对称多处理系统
GCD提供函数实现多线程开发 性能更高 功能也更加强大
首次发布在Mac OSX 10.6, iOS4及以上版本可用

GCD核心慨念
1任务:具有一定功能的代码段 (一般是一个BLOCK或者函数)
2分发队列:GCD以队列的方式进行工作FIFO(先进先出)
3.GCD会根据分发队列的类型 创建合适数量的线程执行队列中的任务

GCD中两种队列:
SerialQueue:一次只执行一个任务 通常用于同步访问特定的资源或数据 。但是当你创建多个SerialQueue时虽然它们各自是同步执行的 但SerialQueue与SerialQueue之间是并发执行的。
Concurrent: 可以并发的执行多个任务 但是遵循FIFO。

串行队列代码示例:

//第一种获取方式:里面的任务是在主线程依次去执行
dispatch_queue_t queue = dispatch_queue_main_queue();
//往队列里添加任务
dispatch_async(queue, ^{NSLog(@"这是第一个任务");
});
//获取串行队列的第二种方式:自己创建队列 第一个参数是队列的名字(苹果推荐首映反向域名去命名) 第二个参数是队列的类型(串行队列 并行队列)这种方式创建的队列 他会自己去开辟一个子线程去完成队列里面的任务。
dispatch_queue_t queue = dispatch_queue_create("com.lanou3g.mySerialQueue", DISPATCH_QUEUE_SERIAL);
//往队列里面添加任务
dispatch_async(queue, ^{NSLog(@"这是第一个任务"); 
});

并行队列代码示例

//第一种方式
//global queue 是苹果里面的全局队列  有四个优先级但没有明显的区别
//第一个参数就是队列的优先级 第二个参数是苹果预留的参数为了以后去使用 目前还没有用到所以填写0
dispatch_queue_t oneQueue = dispatch_get_gloal_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//添加任务
dispatch_async(oneQueue, ^{NSLog(@"这是第一个任务"); });

//第二种创建并发队列的方式
dispatch_queue_t twoQueue = dispatch_queue_create("com.lanou3g.myQueue", DISPATCH_QUEUE_CONCURRENT);
//添加任务
dispatch_async(twoQueue, ^{NSLog(@"这是第一个任务"); });

延迟执行一段代码

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3*NSEC_PER_SEC)), dispoatch_get_main_queue(), ^{NSLog(@"这是第十个任务");});

GCD功能:
dispatch_async() 往队列里面添加任务 任务会排队执行
dispatch_after() 往队列里面添加任务 任务不但会排队 还会在延迟的时间点执行
dispatch_apply() 往队列中添加任务 任务会重复执行n次
dispatch_once() 任务添加到队列中 但任务在程序运行过程中 只执行一次 (单例使用)
dispatch_sync() 将任务添加到队列中 block不执行完 下面的代码不会执行
dispatch_async_f() 将任务添加到队列中 任务是函数非block

dispatch_apply() 示例
dispatch_apply(3, dispatch_get_main_queue(), ^(size_t index){NSL(@"%d", index); });
//第一个参数:执行的次数
//第二个参数:在哪个队列里面去执行
//第三个参数:当前索引
//具体要实现的事情

async和sync的区别
async 不等block体执行完 就去执行下面的代码
sync 会等待block体执行完之后 才回去执行block体外面的代码

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_sync(queue, ^{NSLog(@"第一个任务"); });
NSLog(@"呵呵");
diapatch_async(queue, ^{NSLog(@"第二个任务"); });
NSLog(@"逗逼");

刷新UI要回到主线程操作 GCD返回主线程的方法是dispatch_get_main_queue()
示例:

 NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];
    NSURLSession *session = [NSURLSession sharedSession];
    NSURLSessionTask *task = [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        if (error == nil) {

            //回到主线程刷新UI
            dispatch_async(dispatch_get_main_queue(), ^{

            });
        }
    }];
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

iOS 多线程 GCD浅析

  • 2016-01-07 12:57
  • 59KB
  • 下载

SDK源码解读系列:《iOS与OSX多线程和内存管理》书摘之GCD内部实现(二)

Dipatch Source GCD中除了主要的Dispatch Queue以外,还有不太引人注目的Dispatch Source。它是一种BSD系列内核惯有功能kqueue的封装。 kqueue...

多线程GCD的使用

  • 2013-06-10 10:13
  • 5.32MB
  • 下载

多线程02-GCD 掌握

三、GCD 1.队列和任务 1> 任务 :需要执行什么操作 * 用block来封装任务2> 队列 :存放任务 * 全局的并发队列 : 可以让任务并发执行 dispatch_queue_t queue ...

GCD 多线程

  • 2016-07-01 10:11
  • 11KB
  • 下载

IOS GCD 多线程

  • 2013-11-07 23:25
  • 190KB
  • 下载

iOS开发多线程篇—GCD介绍

iOS开发多线程篇—GCD介绍 一、简单介绍 1.什么是GCD? 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函...

多线程(GCD)的使用

Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法。dispatch queue分成以下三种:1)运行在主线程的Main queue,通过dispatch...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)