美文网首页
GCD的理解与应用

GCD的理解与应用

作者: andy_tu | 来源:发表于2019-02-18 02:23 被阅读0次

一. GCD应用中主要分为函数和队列
函数分为:同步函数,异步函数
同步函数 dispatch_sync(dispatch_queue_t queue, dispatch_block_t blcok);
异步函数 dispatch_async(dispatch_queue_t queue, dispatch_block_t blcok);
队列分为:自己创建的串行队列, 全局并行丢列, 主队列
自己创建的队列 dispatch_queue_t serialQueue = dispatch_queue_create("serial", nil);
全局并行队列 dispatch_queue_t globalQueue = dispatch_get_global_queue(0, 0);
主队列 dispatch_queue_t mainQueue = dispatch_get_main_queue();

同步函数与异步函数区别:同步函数不能开辟子线程,异步函数能开辟子线程.
1.当调用同步函数时,不管队列是串行队列还是并行队列,同步函数的任务都是按顺序加到队列中 串行执行.

2.当调用同步函数时,如果队列是主队列会造成死锁,所以同步函数不能和主队列一起使用.

3.当调用异步函数时, 如果是串行队列只开辟一条子线程,将异步函数的任务加入到串行队列中按顺序执行.

4.当调用异步函数,如果是并行队列,每一个任务加到队列中都是开启一个新子线程运行.

5.当调用异步函数时,如果队列是主队列,因为主队列中只有一条主线程,所以任务都是加入主队列中的主线程按顺序执行. 主线程在IOS中是UI线程.

6.同步函数不开辟新线程,所以不管队列是串行还是并行,当前任务的线程都是主线程.

二. dispatch_group的应用与理解
//dispatch_group 相当于是一个组容器,将任务异步提交到组容器中, 任务可以分别在不同的队列上面执行.
//创建组
dispatch_group_t group = dispatch_group_create();
//需求 任务1,任务2 异步串行 任务3,任务4异步并行 任务5在所有的都完成后在主线程执行
分析: 任务1, 任务2 串行 任务2一定在任务1之后执行, 任务5一定是最后执行, 任务3和任务4位置不确定
//把异步任务提交到任务组扇面
dispatch_queue_t serialQueue11 = dispatch_queue_create("serial", 0);
dispatch_group_async(group, serialQueue11, ^{
NSLog(@"任务1 %@",[NSThread currentThread]);
});
dispatch_group_async(group, serialQueue11, ^{
NSLog(@"任务2 %@",[NSThread currentThread]);
});

dispatch_group_t globalQueue11 = dispatch_get_global_queue(0, 0);
dispatch_group_async(group, globalQueue11, ^{
    NSLog(@"任务3 %@",[NSThread currentThread]);
});
dispatch_group_async(group, globalQueue11, ^{
    NSLog(@"任务4 %@",[NSThread currentThread]);
});

dispatch_group_t mainQueue11 = dispatch_get_main_queue();
dispatch_group_notify(group, mainQueue11, ^{
    NSLog(@"任务5 %@", [NSThread currentThread]);
});

打印结果 验证结果正确
2019-02-18 02:15:25.977950+0800 排序算法[10535:363040] 任务3 <NSThread: 0x600000eb2380>{number = 4, name = (null)}
2019-02-18 02:15:25.977971+0800 排序算法[10535:363042] 任务1 <NSThread: 0x600000eb2440>{number = 3, name = (null)}
2019-02-18 02:15:25.977984+0800 排序算法[10535:363043] 任务4 <NSThread: 0x600000eb24c0>{number = 5, name = (null)}
2019-02-18 02:15:25.978249+0800 排序算法[10535:363042] 任务2 <NSThread: 0x600000eb2440>{number = 3, name = (null)}
2019-02-18 02:15:26.711287+0800 排序算法[10535:362985] 任务5 <NSThread: 0x600000ee2900>{number = 1, name = main}

相关文章

  • GCD的理解与应用

    一. GCD应用中主要分为函数和队列函数分为:同步函数,异步函数同步函数 dispatch_sync(dispat...

  • 第七章、多线程相关

    一、谈谈对GCD的认识理解 Grand Central Dispatch(GCD),主要用于优化应用程序以支持多核...

  • GCD的dispatch_get_specific与dispat

    概述 GCD是一个多核编程的解决方案。它主要用于优化应用程序以支持多核处理器。 GCD介绍 要理解GCD的使用就必...

  • 13 个 GCD 应用场景

    13 个 GCD 应用场景 13 个 GCD 应用场景

  • 源码剖析:探究 Repeat 中 GCD 的应用

    源码剖析:探究 Repeat 中 GCD 的应用源码剖析:探究 Repeat 中 GCD 的应用

  • GCD的理解与使用

    原文链接 GCD的特点 • GCD会自动利用更多的CPU内核• GCD 可用于多核的并行运算• GCD...

  • GCD的理解与使用

    No.1:GCD的特点 GCD 可用于多核的并行运算 GCD 会自动利用更多的 CPU 内核(比如双核、四核) G...

  • GCD理解与使用

    并行与并发: 1.并发:当有多线程操作时,如果系统只有一个cpu,根本不可能真正同时进行一个以上的线程,只能把cu...

  • OC底层原理24、GCD 的应用

    一、GCD的应用与应用原理 1、单例 - dispatch_once_f() 单例代码块: 源码搜索: 1.1、找...

  • iOS GCD 之 函数与队列

    本文的主要目的是理解不同队列与不同函数之间组合的情况 GCD简介 GCD全称是Grand Central Disp...

网友评论

      本文标题:GCD的理解与应用

      本文链接:https://www.haomeiwen.com/subject/qgloeqtx.html