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(), ^{            });        }    }];
0 0