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的基本使用

  • 2015年05月31日 07:50
  • 424B
  • 下载

iOS 多线程 GCD浅析

  • 2016年01月07日 12:57
  • 59KB
  • 下载

ios笔记-- 多线程应该知道的那几件事 GCD NSThread NSOperation

iphone5s 出来了,CPU 升级到了64位 可以应用到更大的内存了,同时对多线程的处理吞吐能力也教之前提升了十几倍。下面着中总结下ios 下多线程的知识点 1:现有的几种多线程 ...

IOS_多线程-GCD的其他用法

  • 2015年05月31日 07:52
  • 426B
  • 下载

GCD 多线程

  • 2016年07月01日 10:11
  • 11KB
  • 下载

Xcode7.2NSThread、GCD多线程创建及简单使用

NSThread、GCD多线程创建及简单使用 【PS】:NSOpretion创建多线程的方式不常使用,本篇不做介绍。 一、NSThread创建多线程 1、线程创建方法 方法一: -(...
  • Mlgbo
  • Mlgbo
  • 2015年12月26日 23:08
  • 620

IOS GCD 多线程

  • 2013年11月07日 23:25
  • 190KB
  • 下载

NSOperation的多线程使用以及和GCD的对比

NSOperation介绍NSOperation类是一个抽象类,用于封装与单个任务相关联的代码和数据。 因为它是抽象的,你不直接使用这个类,而是子类或使用系统定义的子类之一(NSInvocationO...

[读书笔记]iOS与OS X多线程和内存管理 [GCD部分]

3.2 GCD的API 苹果对GCD的说明:开发者要做的只是定义想执行的任务并追加到适当的Dispatch Queue中。 “Dispatch Queue”是执行处理的等待队列。通过dis...

iOS 多线程(四)GCD

GCD:Grand Central Dispatch(GCD) 是异步执行任务的技术之一。一般将应用程序中记述的线程管理用的代码在系统级中实现。开发者只需要定义想执行的任务并追加到适当的Dispatc...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:GCD多线程
举报原因:
原因补充:

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