iOS进阶_GCD(二.GCD串行队列&并发队列)

2023-10-30

GCD 核心概念:将任务添加到队列,指定任务执行的方法

  • 任务
    • 使用block封装
    • block 就是一个提前准备好的代码块,在需要的时候执行
  • 队列(负责调度任务)
    • 串行队列:一个接一个的调度任务
    • 并发队列:可以同时调度多个任务
  • 任务执行函数(任务都需要在线程中执行!)
    • 同步执行:当前指令不完成,不会执行下个指令
    • 异步执行:当前指令不完成,同样可以执行下一条指令

总结:
-开不开线程,取决于执行任务的函数,同步不开,异步才能开。
-开几条线程,取决于队列,串行开一条,并发可以开多条(异步)。

串行并发是根据任务来的

这里写图片描述

同步异步是根据线程来说的

这里写图片描述

串行同步:是我们一个一个依次去队列中拿任务,由主线程依次执行任务
串行异步:是我们一个一个依次去队列中拿任务,去线程池拿一条子线程依次执行任务

并行同步:是我们依次去队列中拿多个任务,交给一条线程去顺序执行
并行异步:是我们依次去队列中拿多个任务,再去线程池拿多个子线程去执行任务

这里写图片描述

串行队列,同步任务:不会开启线程,会顺序执行

//MARK:串行队列,同步任务
/**
 不会开启线程,会顺序执行
 */
-(void)gcdDemo1{
    //1.队列 - 串行
    /**
      1.队列名称:
      2.队列属性:DISPATCH_QUEUE_SERIAL  标示串行
     */
    dispatch_queue_t q = dispatch_queue_create("WT_queue", NULL);
    //2.同步执行任务
    dispatch_sync(q, ^{
        NSLog(@"%@",[NSThread currentThread]);
    });

//执行结果: 2018-05-04 10:45:43.324464+0800 002-GCD串行队列[1426:71131] <NSThread: 0x60400006e6c0>{number = 1, name = main}在主队列中执行
}

串行队列,异步任务

//MARK:串行队列,异步任务
-(void)gcdDemo2{
    //1.队列 - 串行
    dispatch_queue_t q = dispatch_queue_create("WT_queue", NULL);
    //2.异步执行任务
    for (int i=0; i<10; i++) {
        NSLog(@"%d-----------",i);//在主线程中,占用主线程资源,执行完毕后才能打印come here
        dispatch_async(q, ^{
            NSLog(@"%@ %d",[NSThread currentThread],i);
        });
    }//只开一条线程
    NSLog(@"come here");//它在主线程中,与子线程同时执行
}

并发队列,同步步执行

//MARK:- 并发队列,同步步执行
-(void)gcdDemo4{
    /**
     问题:会开几条线程?会顺序执行吗? come here的位置?
     答案:不会,顺序执行,come here在最后打印
     */
    //1.队列 - 并发  DISPATCH_QUEUE_CONCURRENT
    dispatch_queue_t q = dispatch_queue_create("WT_queue", DISPATCH_QUEUE_CONCURRENT);

    //2.同步执行任务
    for (int i=0; i<10; i++) {
        dispatch_sync(q, ^{
            NSLog(@"%@ %d",[NSThread currentThread],i);
        });
    }
    NSLog(@"come here");
}

并发队列,异步执行

//MARK:- 并发队列,异步执行
-(void)gcdDemo3{
  /**
   问题:会开几条线程?会顺序执行吗? come here的位置?
   答案:会开多条线程,不一定会顺序执行,come here在主线程中,与子线程同时开始
   */
    //1.队列 - 并发  DISPATCH_QUEUE_CONCURRENT
    dispatch_queue_t q = dispatch_queue_create("WT_queue", DISPATCH_QUEUE_CONCURRENT);

    //2.异步执行任务
    for (int i=0; i<10; i++) {
        dispatch_async(q, ^{
            NSLog(@"%@ %d",[NSThread currentThread],i);
        });
    }
    NSLog(@"come here");
}

GCD同步任务加强

//MARK:- 并发队列,同步步执行
-(void)gcdDemo4{
    /**
     问题:会开几条线程?会顺序执行吗? come here的位置?
     答案:不会,顺序执行,come here在最后打印
     */
    //1.队列 - 并发  DISPATCH_QUEUE_CONCURRENT
    dispatch_queue_t q = dispatch_queue_create("WT_queue", DISPATCH_QUEUE_CONCURRENT);

    //2.同步执行任务
    for (int i=0; i<10; i++) {
        dispatch_sync(q, ^{
            NSLog(@"%@ %d",[NSThread currentThread],i);
        });
    }
    NSLog(@"come here");
}

在开发中,通常会将耗时操作放后台执行,有的时候,有些任务彼此有“依赖”关系
例子:登录,支付,下载(网络相关的全部放在子线程中执行)
利用同步任务,能够做到任务依赖关系,前一个任务是同步任务,它不执行完,队列就不会调度后面的任务


//MARK - 同步任务作用!
-(void)gcdDemo5{
    dispatch_queue_t loginQueue = dispatch_queue_create("WT_queue", DISPATCH_QUEUE_CONCURRENT);
    //1.用户登录
    dispatch_sync(loginQueue, ^{
        NSLog(@"用户登录  %@",[NSThread currentThread]);
    });
    for (int i=0; i<10; i++) {
        NSLog(@"%d",i);
    }
    //2.支付
    dispatch_async(loginQueue, ^{
        NSLog(@"支付  %@",[NSThread currentThread]);
    });

    //3.下载
    dispatch_async(loginQueue, ^{
        NSLog(@"下载  %@",[NSThread currentThread]);
    });

    NSLog(@"come here");
}

可以让队列调度多个任务前,指定一个同步任务。让所有的异步任务,等待同步任务执行完成,这就是依赖关系
- 同步任务,会造成一个死锁,锁住此线程

#pragma mark -<同步任务>

//MARK: - 增强版同步任务

-(void)gcdDemo6{
    //队列
    dispatch_queue_t q =dispatch_queue_create("WT_queue", DISPATCH_QUEUE_CONCURRENT);
    //任务
    void (^task)(void)=^{
        dispatch_async(q, ^{
            for (int i=0; i<10; i++) {
                NSLog(@"%d %@",i,[NSThread currentThread]);
            }
        });
        //1.用户登录
        dispatch_sync(q , ^{
            NSLog(@"用户登录  %@",[NSThread currentThread]);
        });

        //2.支付
        dispatch_async(q , ^{
            NSLog(@"支付  %@",[NSThread currentThread]);
        });

        //3.下载
        dispatch_async(q , ^{
            NSLog(@"下载  %@",[NSThread currentThread]);
        });


    };
    dispatch_async(q, task);
}

全局队列优先级&服务质量

参数
1.涉及到系统适配
iOS 8 服务质量
QOS_CLASS_USER_INTERACTIVE //用户交互(希望线程快速被执行,不要用耗时的操作)
QOS_CLASS_USER_INITIATED //用户需要的(同样不要使用耗时操作)
QOS_CLASS_DEFAULT //默认的(给系统来重置队列的)
QOS_CLASS_UTILITY //使用工具(用来做耗时操作)
QOS_CLASS_BACKGROUND //后台
QOS_CLASS_UNSPECIFIED //没有指定优先级

iOS 7 调度的优先级
- DISPATCH_QUEUE_PRIORITY_HIGH 2 //高优先级
- DISPATCH_QUEUE_PRIORITY_DEFAULT 0 //默认优先级
- DISPATCH_QUEUE_PRIORITY_LOW (-2) //低优先级
- DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN //后台优先级

 提示:不管是优先级还是服务质量,尤其不要选择BACKGROUND。如果选择线程执行会慢到令人发指!

   2.为未来使用的一个保留,现在始终给0

 在老项目中,一般还是没有淘汰iOS 7,没法使用服务质量   
//MARK: 全局队列
-(void)gcdDemo7{
    //全局队列(本质上是并发队列)

    dispatch_queue_t q = dispatch_get_global_queue(0, 0);

    for (int i=0; i<10; i++) {
        dispatch_async(q, ^{
            NSLog(@"%@ %d",[NSThread currentThread],i);
        });
    }

    NSLog(@"come here");
}

全局队列 & 并发队列 区别
1> 名称,并发队列取名字,适合于企业开发跟踪错误
2> release,在MRC 并发队列 需要使用的
dispatch_release(q);//ARC情况下不需要release!

全局队列 & 串行队列
全局队列:并发,能够调度多个线程,执行效率高
-费电
串行队列:一个一个执行,执行效率低
-省电

    判断依据:用户上网方式
     -WIFI:可以多开线程
     -流量:尽量少开线程
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS进阶_GCD(二.GCD串行队列&并发队列) 的相关文章

  • iPhone 6 隐藏在键盘下方的自动校正

    自动修正UITextview在 Iphone5s 中工作正常 但在 iPhone 6 中它被隐藏在键盘后面 在 iPhone 5s 中按预期工作 但不适用于 iphone 6 有什么办法可以解决 iPhone 6 上的这个问题吗 不 去物业
  • 从 NSString 获取子字符串,直到到达特定单词

    假设我有这个NSString Country Address Tel number 我该如何获取之前的子字符串Tel 国家地址 然后我该如何获取后面的子字符串Tel 数字 使用 NSScanner NSString string Count
  • 按下后退按钮时 SwiftUI 工具栏项目被剪裁

    我在 SwiftUI 中遇到了一种奇怪的行为 我似乎无法解决它 鉴于以下简单的示例应用程序 我遇到了这种行为 工具栏项目在初始运行时正确呈现 但导航离开并返回它会被剪切 重新创建此示例代码 内容视图 swift import SwiftUI
  • 如何确定 NSURLSessionTask 请求何时开始?

    I use NSURLSessionTask我正在尝试监视我的一些 HTTP 请求需要多长时间 我可以监视什么委托方法 或其他方法 NSURLSessionTask实际上提出了最初的请求 如果这是一个NSURLConnection里面一个N
  • 如何防止 iPhone 4 在添加到主屏幕时截断我的标题?

    我的网页标题很长 当添加到 iPhone 旧版本的主屏幕时 整个标题在确认对话框中可见 当我添加到 iPhone 4 的主屏幕时 标题在第 12 个符号之后被切断 有没有办法阻止这种剪切 让 iPhone 默认显示完整标题 显然会有一个无证
  • ios7 绘图时出现延迟

    我有一个应用程序 在其中我正在视图上绘制一些草图 到目前为止 在我安装之前它运行良好ios7 我的应用程序使用触摸移动方法来识别运动的变化 但是当我画一条线时 触摸方法被调用 但线不会更新 直到我触摸结束ios7 所以画起来有一点点滞后 它
  • 在React-native中,如何更改NavigatorIOS的样式

    在react native中 如何更改NavigatorIOS的样式 例如背景颜色 谢谢你 var speedNews React createClass render function return
  • 使用 Core Data Swift 对 TableView 和行进行分区

    我在 sqlite 中有两个表 代码由 XCode Generation 生成 class Event NSManagedObject NSManaged var startDate NSDate NSManaged var details
  • 如何检测文本是否可读?

    我想知道是否有一种方法可以告诉给定的文本是人类可读的 我所说的人类可读的意思是 它有一些含义 格式就像某人写的文章 或者至少是由软件翻译器生成的供人类阅读的文章 这是背景故事 最近我正在制作一个应用程序 允许用户将短文本上传到数据库 在部署
  • 错误:“消息回复时间太长”向设备手表套件 OS 2 发送消息

    从 Apple Watch 向设备发送消息时出现以下错误 错误域 WCErrorDomain代码 7012 消息回复时间太长 UserInfo NSLocalizedDescription 消息回复时间太长 NSLocalizedFailu
  • SwiftUI TabbedView 仅显示第一个选项卡的内容

    我正在尝试建立一个TabbedView使用以下简单代码 TabbedView Text Hello world tabItemLabel Text Hello Text Foo bar tabItemLabel Text Foo 运行时 两
  • 块执行后变量返回 null

    我正在调度一个队列来在单独的线程上下载一些 flickr 照片 在 viewWillAppear 中 当我记录块内数组的内容时 它完美地显示了所有内容 dispatch queue t photoDowonload dispatch que
  • 将深层链接传递到 iOS 模拟器?

    我想找到一种更简单的方法来在 iOS 模拟器中调用深层链接 在 Android 上 您可以使用 ADB 通过控制台将链接传输到模拟器中 是否有类似的方法或解决方法来打开最新 iOS 模拟器的深层链接 您可以在终端中输入以下内容 xcrun
  • 平滑地将渐变应用于 UIImage

    我正在尝试使用 CoreGraphic 将渐变应用于 UIImage 然而 我得到的结果不是很好 我想在图像底部创建一个黑色到透明的渐变 以便为我放置一些文本创建对比度 然而 我能够实现的渐变与图像不能很好地融合 你可以清楚地看到中心的分离
  • Swift 3 的 NSLog 问题

    迁移到 Swift 3 后 当我尝试执行以下操作时出现错误 self publicDB save listRecord completionHandler record error gt Void in if let saveError e
  • AVPlayer 失败并显示 AVPlayerItemStatusFailed(OSStatus 错误 -12983)

    有时 AVPlayer 会失败AVPlayerItemStatusFailed发生故障后 AVPlayer 继续失败AVPlayerItemStatusFailed 我尝试清除 AVPlayer 实例并创建新实例 但无法实现AVPlayer
  • 在模拟器上卸载应用程序后,NSUserDefaults 未清除

    这听起来可能很菜鸟 我想检查用户是否第二次进入我的应用程序 以便保留我正在使用的运行计数NSUserDefaults 我已经在我的中实现了以下代码rootViewController s viewDidLoad method NSUserD
  • 动态框架中未定义的架构符号

    我正在开发一个 iOS 框架 该框架包含多个第三方框架并使用 UnitySendMessage C 方法与 Unity 进行通信 我想创建一个动态框架 支持 iOS8 但我偶然发现以下编译错误 Undefined symbols for a
  • 当 tableView 的 allowedMultipleSelectionDuringEditing 属性为 YES 时,如何实现滑动删除功能?

    在 iOS 5 中 如果我设置allowsMultipleSelectionDuringEditing在 UITableView 上设置为 YES 然后滑动删除功能不再起作用 内置的邮件应用程序支持滑动删除和编辑模式下的多项选择 我也想这样
  • Phonegap - cordova 在 Android 和 iOS 设备上延迟且缓慢

    我刚刚开始使用 zend studio 开始我的第一个 PhoneGap 项目 但是 在我构建并部署它之后 该应用程序非常慢 Android 和 iOS 均可 滚动滞后 如果我按下按钮 转到下一页的速度很慢 有什么办法可以提高它的性能吗 提

随机推荐

  • 【error】Doubbo 服务启动异常:java.lang.RuntimeException: [source error] getPropertyValue,问题分析,解决方案

    目录 1 报错信息 2 原因分析 3 解决方案 4 提示 1 报错信息 java lang RuntimeException source error getPropertyValue Ljava lang Object Ljava lan
  • R语言—向量

    向量 vector R 语言最基本的数据结构是向量 类似于数学上的集合的概念 由一个或多个元素构成 向量其实是用于存储数值型 字符型 或逻辑型数据的一维数组 创建向量 c 函数 gt a lt 1 给a赋值1 gt a 显示a的值 1 1
  • 解密企业级PPPoE:部署、配置和管理的最佳实践

    亲爱的读者朋友们 今天 我将带你一起探索企业级PPPoE 这个让你畅快玩转互联网的神奇协议 首先 让我们来了解一下什么是PPPoE 它代表着 点对点协议以太网 是一种强大而灵活的网络连接协议 对于企业来说 部署PPPoE意味着你可以轻松实现
  • Java实现实现简单算法之最长对称字符串

    题目 已知一字符串 求其内包含的最长对称字符串 例 已知字符串 google 输出最长对称字符串 goog 已知abada 输出aba 已知sdghjdgzzgdah 输出 dgzzgd 看到题目时 大家第一反应都是模棱两可的 好像可以这样
  • Selenium+Python3之:多线程进行跨浏览器测试

    python多线程跨浏览器测试 1 引言 2 跨浏览器操作及定义 2 1 啥是跨浏览器测试 2 2 为啥要进行跨浏览器测试 2 3 跨浏览器测试执行 3 代码编写实战 1 引言 在WebUI自动化方面的博文 我也是有好一段时间没有更新了 这
  • 什么是期货交易的技术分析(期货交易市场技术分析)

    什么是期货买卖的本领领会 拓展材料 1 期货本领领会规则 期货本领领会的规则是伴随趋向 期货本领领会的表面普通 期货本领领会的表面普通是创造在三个有理的假如之上的 商场动作具备容纳性和容纳性 价钱以一种趋向的办法兴盛 汗青将重演 在这三个假
  • 如何利用Python爬虫在网上接单,一周赚7800元,一天只要两小时 !

    1 兼职处理数据 互联网时代下 越来越多的人离不开电脑办公 而与电脑办公分隔不开的 就是处理电脑上保存的数据 虽然说Excel整理数据功能很强大 但在Python面前 曾经统治职场的它也得败下阵来 因为Python在搜集整理分析数据的过程中
  • ConstraintLayout 高级特性,工具总结

    layout constraintWidth 用法 xml中 app layout constrainedWidth true 作用 使得该view的宽受限于他的约束 app layout constrainedHeight true 同理
  • ChatGPT专业应用:基于关键词撰写原创文章

    正文共 485 字 阅读大约需要 2 分钟 内容运营 SEO投放必备技巧 您将在2分钟后获得以下超能力 基于关键词撰写原创文章 Beezy评级 B级 经过简单的寻找 大部分人能立刻掌握 主要节省时间 推荐人 Kim 编辑者 Linda 此图
  • QT CREATOR 插件开发:添加新的工程类型(上)

    Qt Creator 中 新的工程类型将出现在 文件 gt 新建 菜单项中 我们可以通过打开的选择工程类型的对话框来找到所需要的工程 在本章中 我们将学习如何向上面所示的对话框中添加新的工程类型 Core IWizard接口 Qt Crea
  • 基于富芮坤fr8016 蓝牙5.0 芯片设计的BLE HID Joystick 游戏摇杆设备

    文章目录 ble hid 学习笔记 HID报告描述符与BLE HID profile之间关系 1 HID报告描述符 富芮坤fr8016 设计Joystick例子 1 描述X轴Y轴Z轴 2 描述按钮 3 Joystick 报告描述符 4 程序
  • Linux服务 Nginx(二)

    Linux服务 Nginx 二 最权威的资料 官方文档http nginx org en docs 主配置段的指令 正常运行的必备配置 1 user USERNAME GROUPNAME 指定运行worker进程的用户和组 Syntax u
  • c语言利用穷举法求1-100内的质数

    方法 include
  • 广告数据集mapreduce实验(词频统计)

    本实验是使用广告数据集 通过mapreduce获取购买者年龄人数分布 数据列分别为 ad id xyz campaign id age gender Impressions Clicks Total Conversion Approved
  • 基于MNIST实现GAN(pytorch)

    基于MNIST实现生成对抗网络 pytorch逐行实现 本文是pytorch逐行实现GAN网络 作为一个基础GAN框架来学习 以后编写复杂的GAN的衍生网络框架都是同样的思想 import numpy as np import torch
  • Linux 下获取Root权限的几种方法

    方法分为永久性获取root权限以及非永久性获取Root权限 非永久性获取Root权限 非永久性获取Root权限可以在我们要键入的命令之前加上sudo前缀 如我们要键入的命令是 rm 以Root用户执行的方式就是 sudo rm 这样在每个需
  • 苹果的AI野心:内耗、反击与挑战

    图片来源 由无界AI生成 作者丨山核 苹果一年一度的秋季 春晚 时间越来越近 但在大模型浪潮下 苹果何时推出自己的 苹果GPT 成了另一个关注的话题 毕竟 前有华为 后有小米 在中国手机厂商争相将大模型装进移动终端的同时 苹果却依旧对AI大
  • ubuntu16.04 conda新建环境安装新版gcc教程

    首先 使用conda新建环境 conda create name yourenvname python 3 x 最新版的gcc移步链接 上面是我所选择的版本号 选择了第一个命令 创建一个如上图类似的软链接即可 这一步一定要寻找bin下面的新
  • Mysql的explain官方文档翻译

    原文地址 https dev mysql com doc refman 5 7 en explain output html explain extra information 先复制进来 每天翻译一段 有兴趣的小伙伴可以一块加入进来翻译
  • iOS进阶_GCD(二.GCD串行队列&并发队列)

    GCD 核心概念 将任务添加到队列 指定任务执行的方法 任务 使用block封装 block 就是一个提前准备好的代码块 在需要的时候执行 队列 负责调度任务 串行队列 一个接一个的调度任务 并发队列 可以同时调度多个任务 任务执行函数 任