GCD多线程
来源:互联网 发布:mac option 编辑:程序博客网 时间:2024/06/11 05:11
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 是苹果里面的全局队列 有四个优先级但没有明显的区别//第一个参数就是队列的优先级 第二个参数是苹果预留的参数为了以后去使用 目前还没有用到所以填写0dispatch_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(), ^{ }); } }];
- GCD多线程
- 多线程GCD
- GCD多线程
- 多线程-GCD
- 多线程 gcd
- 多线程GCD
- 多线程&GCD
- GCD多线程
- 多线程GCD
- 多线程:GCD
- 多线程-GCD
- 多线程GCD
- 多线程-GCD
- GCD(多线程)
- 多线程GCD
- 多线程GCD
- 多线程 GCD
- 多线程GCD
- 第十三周【项目2 动物这样叫】
- linux学习之路——软链接和硬链接
- 龙书D3D11章节习题答案(第九章)
- mysql常用命令
- 5.8逻辑
- GCD多线程
- Vim编辑器临时文件
- day3 if else 和switch的学习
- 机器学习系列:(一)机器学习基础
- 技术中常见的一些名词
- Libgdx---模拟点击事件(代码点击事件)
- viewpager动态加点的方法
- *第十一周项目训练9.2 存储班长信息的学生类
- 浏览器缓存详解:expires,cache-control,last-modified,etag详细说明