GCD 的使用

GCD详解 什么是GCD? Grand Central Dispatch或者GCD,是一套低层API,提供了一种新的方法来进行并发程序编写。从基本功能上讲,GCD有点像 NSOperationQueue,他们都允许程序将任务切分为多个单一任务然后提交至工作队列来并发地或者串行地执行。GCD比之 NSOpertionQueue更底层更高效,并且它不是Cocoa框架的一部分。 除了代码的平行执行能力, 阅读详情

GCD : 纯 C 语言的 API

GCD 核心
1.任务:执行什么操作
同步:永远只在当前线程上 从上往下,依次执行 执行,这个就叫做同步
异步:永远不在当前的线程上执行,它跑到别的线程上面去执行。
总结:同步方法 永远在当前线程上执行,所以没有开辟线程的能力。
异步方法,因为要在别的线程上去执行,所以它具有开辟线程的能力。
当遇到主队列,这个奇葩的时候,它就不起作用

2.队列:用来存放任务
作用:将相同的任务放在同一个队列中,方便管理

a.串行队列:
加入到里面的任务是一个一个有顺序的调度的。

    串行队列,同步任务
        特点:有顺序的执行,并且不会开辟新线程,就在当前线程执行
        应用场景:FMDB,它为什么要设计成串行队列,同步任务,为了保证数据的安全
/**
 *  串行队列,同步任务执行
 */
- (void)selrilSync {
  // 1.创建任务
  void (^task1)() = ^() {
    NSLog(@"task1----%@", [NSThread currentThread]);
  };
  void (^task2)() = ^() {
    NSLog(@"task2----%@", [NSThread currentThread]);
  };
  void (^task3)() = ^() {
    NSLog(@"task3----%@", [NSThread currentThread]);
  };
  // 2.创建队列 串行队列

  dispatch_queue_t serial =
      dispatch_queue_create("cn.jingcheng", DISPATCH_QUEUE_SERIAL);

  //将任务添加带队列中
  dispatch_sync(serial, task1);
  dispatch_sync(serial, task2);
  dispatch_sync(serial, task3);
}
    串行队列,异步任务
        特点:有顺序的执行,并且在开辟的新的线程中执行,并且只开一条线程!!!
        应用场景:耗时操作,并且有严格先后顺序
        去付费网站上,下载片
        登录--->付费--->下载
/**
 *  串行队列,异步执行
 */
- (void)serialAsync {

  void (^task1)() = ^() {
    NSLog(@"task1----%@", [NSThread currentThread]);
  };
  void (^task2)() = ^() {
    NSLog(@"task2----%@", [NSThread currentThread]);
  };
  void (^task3)() = ^() {
    NSLog(@"task3----%@", [NSThread currentThread]);
  };

  dispatch_queue_t serial = dispatch_queue_create("cn.jingcheng", NULL);

  dispatch_async(serial, task1);
  dispatch_async(serial, task2);
  dispatch_async(serial, task3);
}

b.并发队列:
特点:
任务可以同时执行,这样可以提高程序的运行效率.

    并发队列,同步任务
        特点:没有开辟新线程,同时是按照顺序
        应用场景:开发中几乎不用
/**
 *  并发队列,同步任务执行
 */
- (void)concurrentSync {
  void (^task1)() = ^() {
    NSLog(@"task1----%@", [NSThread currentThread]);
  };
  void (^task2)() = ^() {
    NSLog(@"task2----%@", [NSThread currentThread]);
  };
  void (^task3)() = ^() {
    NSLog(@"task3----%@", [NSThread currentThread]);
  };

  dispatch_queue_t concurrent =
      dispatch_queue_create("cn.jingcheng", DISPATCH_QUEUE_CONCURRENT);
  dispatch_sync(concurrent, task1);
  dispatch_sync(concurrent, task2);
  dispatch_sync(concurrent, task3);
}
    并发队列,异步任务
        特点:会开线程,开N条,表示不固定,因为我们的线程循环利用的功能       没有顺序.
        应用场景:
            比如下载多部片
/**
 *  并发队列,异步任务执行
 */
- (void)concurrentAsync {
  void (^task1)() = ^() {
    NSLog(@"task1----%@", [NSThread currentThread]);
  };
  void (^task2)() = ^() {
    NSLog(@"task2----%@", [NSThread currentThread]);
  };
  void (^task3)() = ^() {
    NSLog(@"task3----%@", [NSThread currentThread]);
  };

  dispatch_queue_t concurrent =
      dispatch_queue_create("cn.jingcheng", DISPATCH_QUEUE_CONCURRENT);

  dispatch_async(concurrent, task1);
  dispatch_async(concurrent, task2);
  dispatch_async(concurrent, task3);
}

c.全局队列:
和并发队列,执行效果一样,只是说,并发队列,需要我们程序员,自己创建
而全局队列,是由于系统提供

    特点:
        任务可以同时执行,这样可以提高程序的运行效率.

     全局队列,同步任务
     特点:没有开辟新线程,同时是按照顺序
     应用场景:开发中几乎不用

     全局队列,异步任务
     特点:会开线程,开N条,表示不固定,因为我们的线程循环利用的功能       没有顺序.
     应用场景:
     比如下载多部片
/**
 *  全局队列
 */
- (void)globalQueue{
    dispatch_queue_t global = dispatch_get_global_queue(0, 0);
    //全局队列同步执行任务
    dispatch_sync(global, ^{
        NSLog(@"%@",[NSThread currentThread]);
    });
    //全局队列异步执行任务
    dispatch_sync(global, ^{
        NSLog(@"%@",[NSThread currentThread]);
    });
}

d.主队列(奇葩):
特点:
它永远在主线程工作,这个是苹果给开发人员,提供,回到主线程做事的一种机制

    主队列,同步任务
        特点:主队列,只有在`主线程空闲`的时候,才能调度里面的任务
        造成死锁

    主队列,异步任务
        应用场景:
        回到主线程做事,一般是做和UI相关的工作.
/**
 *  主队列
 */
- (void)mainQueue {

  dispatch_queue_t mainQ = dispatch_get_main_queue();
  //全局队列同步执行任务 (死锁)
  dispatch_sync(mainQ, ^{
    NSLog(@"%@", [NSThread currentThread]);
  });
  //全局队列异步执行任务
  dispatch_sync(mainQ, ^{
    NSLog(@"%@", [NSThread currentThread]);
  });
}
    总结:任务的优先级比队列优先级高,所以我们在队列和任务的各种组合的时候,首先要看我们的任务.
    1.开不开线程,由任务决定
        异步才有开辟线程的能力,同步没有开辟线程的能力
        异步是在其它线程上执行,同步,在当前线程上执行.
        iOS 8.0 之后,GCD 能够开启非常多的线程
        iOS 7.0 以及之前,GCD 通常只会开启 5~6 条线程
    2.在开发中,主队列比较奇葩,主队列,就是苹果提供给我们,快速回到主线程的种实现机制.

开发中队列的选择
多线程的目的:将耗时的操作放在后台执行!

串行队列,只开一条线程,所有任务顺序执行

队列组
有这么1种需求
首先:分别异步执行2个耗时的操作
其次:等2个异步操作都执行完毕后,再回到主线程执行操作

如果想要快速高效地实现上述需求,可以考虑用队列组

  //创建队列组
    dispatch_group_t group =  dispatch_group_create();

    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        // 执行1个耗时的异步操作
    });
    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        // 执行1个耗时的异步操作
    });
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        // 等前面的异步操作都执行完毕后,回到主线程...
    });
- (void)cacheStatusImage:(NSArray *)array and:(FinishedArray)finish {
  if (array.count == 0) {

    finish(nil, nil);

    return;
  }
    //创建线程组
  dispatch_group_t group = dispatch_group_create();

  for (XFStatues *statues in array) {

    NSArray *urls = statues.danLoadPicUrl;

    if (urls.count != 1) {
      continue;
    }

    for (NSURL *imageUrl in urls) {
        //操作开始
      dispatch_group_enter(group);
      [[SDWebImageManager sharedManager] downloadImageWithURL:imageUrl
          options:0
          progress:^(NSInteger receivedSize, NSInteger expectedSize) {

          }
          completed:^(UIImage *image, NSError *error,
                      SDImageCacheType cacheType, BOOL finished,
                      NSURL *imageURL) {

            NSLog(@"单张图片下载完成");
              //操作结束
            dispatch_group_leave(group);
          }];
    }
  }
  //线程组下载图片任务全部完成,主线程完成所有图片下载回调
  dispatch_group_notify(group, dispatch_get_main_queue(), ^{

    NSLog(@"所有图片下载完成");

    finish(nil, array);
  });
}

如果任务有先后执行顺序的要求
效率低 -> 执行慢 -> “省电”
有的时候,用户其实不希望太快!例如使用 3G 流量,”省钱”

并发队列,会开启多条线程,所有任务不按照顺序执行
如果任务没有先后执行顺序的要求
效率高 -> 执行快 -> “费电”
WIFI,包月

实际开发过程中开辟线程数
WIFI 线程数 6 条
3G / 4G 移动开发的时候,2~3条,再多会费电费钱!

快速gcd vs 普通gcd 听说快速gcd很快,于是我就突发奇想,看看它到底有多快普通gcd函数:ll gcd(ll a,ll b){ ll m=a%b; while(m){ a=b;b=m; m=a%b; } return b; }快速gcd函数:ll kgcd(ll a,ll b){ ll s=1,c; while(a&&b){ 阅读详情

相关推荐

12V转5V稳压电路详细分析(7805三端稳压,LM2596稳压)

7805线性三端稳压 DCDC的意思是直流变到直流(不同直流电源值的转换),只要符合这个定义都可以叫DCDC转换器,或称之为开关电源或开关调整器。 7805属于常用的线性三端稳压器,输入电压范围不大于35V,输入输出压差2V,最大输出电流1.5A,下图为原理图,其原理简单,使 用方便,深受很多用户的喜爱。但是其不足之处就是效率低,特别是压差越大时其效率越低。比如这里12V转5V的效率为 5V/12V≈41.7%。 如上电路是最经典的7805稳压5V电路,电路中有两个电容,电容的作用如下: ...

a2001444的博客 9万+

多线程 - 08.GCD其他使用

1.GCD线程之间的通信 使用异步函数+除了主队列之外的队列创建子线程,在子线程中执行下载操作(耗时操作) 在子线程中添加任务到主队列(更新UI操作),同步异步都可 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ // 1.创建并发队列 dispatch_queue_t queue = dispatch

MrRightZJ的博客 645

Navicat16/17数据库密码安全解析与实战解密指南

本文详细解析了Navicat 16/17版本中数据库密码的加密机制,并提供了实用的密码找回指南。通过导出连接文件获取加密密文,利用基于AES-128-CBC算法的本地HTML工具,可安全、离线地解密遗忘的密码。文章强调该方法仅适用于合法恢复自有密码,并给出了操作步骤与安全建议。

weixin_28835583的博客 466

【iOS沉思录】GCD实现线程同步的方法

在iOS多线程中我们知道NSOperationQueue操作队列可以直接使用addDependency函数设置操作之间的依赖关系实现线程同步,还可以使用setMaxConcurrentOperationCount函数直接设置最大并发数量。那么在GCD中又是如何实现线程同步和控制最大并发数量的呢? 事实上在之前的问题中我们已经提到了GCD实现线程同步的两种方法了,一种是组队列(dispatch_gro

Mr_厚厚的博客 4373

Intel RealSense D435 深度相机详解

Intel RealSense D435 深度相机是 Intel 推出的一款基于深度感知技术的相机,广泛应用于机器人、无人机、增强现实(AR)、虚拟现实(VR)、3D扫描、智能监控等领域。D435 是 RealSense 系列中较为高端的深度相机之一,结合了深度传感和 RGB 摄像技术,为用户提供高精度的深度数据和高质量的图像捕捉能力。

crasher123的博客 2944

别再混淆了!5分钟搞懂机器人导纳控制与阻抗控制的本质区别(附Simulink对比仿真)

本文深入解析机器人柔顺控制中的导纳控制与阻抗控制的本质区别,通过信号流方向、架构对比和应用场景三个关键视角进行详细阐述。文章还提供Simulink对比仿真案例,帮助读者快速理解两种控制策略的差异及其适用场景,特别适合机器人控制领域的研究者和工程师参考。

weixin_42543046的博客 604

hdu2588 GCD(欧拉函数)

GCD Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1419    Accepted Submission(s): 662 Problem Description The greatest common divisor

Programing_Excalibur的博客 531

SAP Single Sign-On 全景指南:从传统 SAP SSO 到 SAP Secure Login Service for SAP GUI 的架构、场景与迁移实践

本文系统梳理了SAP生态下的单点登录技术方案,重点分析了SAP GUI的云化替代方案SAP Secure Login Service(SLS)。内容涵盖SNC、Kerberos/SPNEGO、SAML 2.0等核心协议的技术实现,对比了传统SAP SSO与新型SLS for SAP GUI的架构差异,并给出AS ABAP系统的具体实施路径。针对SAP GUI访问、浏览器访问Fiori/移动端等不同场景,提供了详细的协议选型建议和配置指南,帮助团队构建安全可靠且适应云时代的统一认证体系。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 273

GCD

http://acm.hzau.edu.cn/problem.php?id=1202&csrf=gsbkpVmkV0QSB7bF1ZZYIdYM5y1coHa9 时间限制: 1 Sec  内存限制: 1280 MB 题目描述 输入  The first line is an positive integer  T . (1<=T<= 10^3) indicates ...

ityanger的技术栈 3392

【WRF理论第十五期】WPS中输入geogrid二进制格式

WPS中输入geogrid二进制格式

WW、forever的博客 1079

Java中使用工厂模式和策略模式优雅消除if-else语句(UML类图+案例分析)

在最近的后端开发中,多多少少会发现有很多if-else语句,如果条件过多则会造成整体代码看起来非常臃肿。本篇博客汇总了我对工厂模式和策略模式的理解,以及我是如何把它们巧妙运用在实际项目当中的一些技巧进行了分享,如有问题,欢迎评论区讨论!

黄团团的个人博客 2612

GCD实践——GCD延时执行

这里我将为大家用两种方式来实现延时操作,分别是NSThread和GCD方式。并比较他们的优劣。我把代码放到了Github上面     ,中的GCD02. 【使用NSThread实现延迟】 (1)拖入GCD源码。代码如下: #import "ViewController.h" #import "GCD.h" @interface ViewController () @end @im

乞力马扎罗的雪CYF的博客 3406

【报错解决】彻底解决 MySQL 登录报错 ERROR 1045 (28000)

MySQL 报错 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) 通常是由于用户名或密码错误、权限不足、服务未启动或配置文件异常导致的。通过检查并确认密码、重置 root 用户密码、授予完整权限、校验配置文件以及确保 MySQL 服务正常运行,可以彻底解决该问题。掌握这一流程不仅能够恢复 root 登录,还能保障数据库的安全性与稳定性。

博客 1750

GCD深入学习之GCD的初识

如果移动端访问不佳,可以访问我的个人博客 现在网上关于GCD的介绍已经很多了,在项目中也经常用到,但是没怎么深入研究过,打算写一系列关于GCD使用,参考其他大神写的博客和Apple的技术文档总结一下,一是自己深入学习一下,二是以后忘了可以回过头来温习一下~ 什么是GCD?GCD全名是Grand Central Dispatch(大中央调度器),是系统级的,存在于libdispatch.dylib

W_C__L的博客 7301

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

GCD基本使用总结

1.GCD的基本使用 1.1 同步执行 + 串行队列 总结:所有任务都是在主线程完成的,证明了同步执行不具备开启新的线程。所有任务都是按序执行。 1.2 同步执行+并发队列 总结:所有任务都是在主线程中执行的,没有开启新的线程,也就是说同步不具备开启新线程的能力。虽然并发队列可以同时执行多个任务,但是当前只有一个线程,一个线程只能执行一个任务,所以这里也就不存在并发队列。 ...

ivolcano的博客 2251

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

GCD定时器(GCD Timer)

时间来不及了,赶快上车… /// 创建一个Timer // /** // dispatch_source创建方法 // // @param type 创建的dispatch_source的类型 // @param handle // @param mask // @param queue 添加到的队列 // @return 返回一个新创...

MeteoriteMan的博客 2533

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

GCD的使用

文章目录线程和队列的关系队列创建队列获取标记符任务创建(dispatch_sync和dispatch_async)线程和runloop队列使用时可能用到的其他APIdispatch_set_target_queue变更队列优先级dispatch_barrier_async 栅栏方法dispatch_after 延时执行方法dispatch_once 一次性代码(只执行一次)dispatch_apply 快速迭代方法dispatch_group 队列组dispatch_group_notify 监听dispa

吃橘子 471

GCD简介

1. 什么是GCD GCD,全称是Grand Central Dispatch,它是C语言的API. GCD的核心 : 将block(任务)添加到queue(队列)中. 官方文档的描述: Grand Central Dispatch(GCD)是异步执行任务的技术之一。一般将应用程序中记述的线程管理用的代码在系统级中实现.开发者只需定义想执行的任务并追加到适当的Dispatch Queue中,GCD就能生成必要的线程并执行任务,这样就比以前的线程更有效率. 2.日常使用 dispatch_queu

吃橘子 1万+

【iOS】GCD学习

本博客撰写一下小蓝书的GCDGrand Central Dispatch(GCD)是异步执行任务的技术之一。一般将应用程序中记述的线程管理用的代码在系统级中实现。开发者只需要定义想执行的任务并追加到适当的Dispatch Queue中,GCD就能生成必要的线程并计划执行任务。由于线程管理是作为系统的一部分来实现的,因此可统一管理,也可执行任务,这样就比以前的线程更有效率。//让处理在后台线程中执行/**长时间处理*例如AR用画像识别*例如数据库访问*//*

weixin_72437555的博客 1314

iOS中GCD的使用

在iOS开发中,所有的UI操作都是在主线程中进行的,那么如果将把耗时操作也放在主线程中,就会造成页面卡顿的现象。因此我们应该将耗时操作放在子线程中执行,GCD是iOS多线程当中比较常用的方法,下面简单介绍一下GCD的使用。 一、GCD当中的基本概念 1.同步函数和异步函数 同步函数: 同步函数不具备开启新线程的能力 dispatch_sync(dispatch_queue_t _Nonnull...

cherry的博客 2487

iOS——GCD再学习

在异步方法内又同步执行了一个方法,又因为同步执行中的方法执行完成前会阻塞当前线程,因此任务3执行完成前会一直阻塞线程,但是这个同步方法是处于串行队列的,因此要执行任务3要等待任务4执行完,但是任务4又要等任务3执行完才能执行,因此发生了死锁,跟那个主队列+同步执行差不多。syncConcurrent任务在其他线程中执行到追加 任务 1 到主队列中,因为主队列现在没有正在执行的任务,所以,会直接执行主队列的 任务1,等 任务1 执行完毕,再接着执行 任务 2、任务 3。(异步执行 具备开启新线程的能力。

m0_73348697的博客 2243

iOS——【GCD】

GCD指的是Grand Central Dispatch,它是苹果公司开发的一套多线程编程技术。GCD提供了一种简单而有效的方式来管理应用程序中的并发任务。它通过将任务提交到适当的队列(串行队列或并发队列)来管理并发执行的任务,从而帮助开发者更轻松地实现并发编程,提高应用程序的性能和响应速度。上面的就是在后合线程中执行长时间处理,处理结束时,主线程使用该处理结果的源代码。这样,dispatch_async (queue, ^{ 这仅有 一行的代码表示让处理在后台线程中执行。

m0_73348697的博客 1921

python gcd_Python程序来查找数组的GCD

python gcdGCD of two or more non-zero number is the largest number that divides both or more non-zero numbers. It is one of the basic concepts of mathematics. 两个或多个非零数字的GCD是将两个或多个非零数字相除的最大数字。 它是数学的基本...

986
上一篇: Swift 中的闭包循环引用
下一篇: NSOperation使用
Step_Next
博客等级 码龄11年 0粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值