使用GCD-dispatch_semaphore同步下载请求

iOS-多线程网络同步请求(dispatch_semaphore) 1、简介:dispatch_semaphore_t:表示信号,生成信号的方法是dispatch_semaphore_t semaphore= dispatch_semaphore_create();dispatch_semaphore_wait:信号等待,它像一个安保,比如小区规定最多只能进入3辆车,而进入一辆车后名额就会减少一个,当剩下的名额为0的时候,再有汽车说要进去时,就只能在外面等待了,直... 阅读详情

场景:

多个请求任务需要按顺序执行。

方案:

使用GCD信号量值来控制线程等待(锁)

定义:

1.dispatch_semaphore_create(信号量的值)  //创建信号量,手动设置为0,模仿线程锁住

1.dispatch_semaphore_wait(信号量, 等待时间) //当信号量为0的时候,就会一直处于等待状态

1.dispatch_semaphore_signal(信号量)  //发送信号量,值自动+1

使用:

使用GCD 信号量控制前-----难过

1.模拟设置两个请求,第一个请求时间比第二个长,但是需要先执行第一个请求

// 第一步请求
- (void)firstRequest{
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        NSLog(@"请求第一步");
    });
}

// 第二步请求
- (void)secondRequest{
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        NSLog(@"请求第二步");
    });
}


2.异步线程请求

- (void)requestAction:(UIButton *)btn{
    NSLog(@"开始请求-----------");
    dispatch_queue_t queque = dispatch_queue_create("miximixi", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(queque, ^{
        [self firstRequest];
        [self secondRequest];
    });
    NSLog(@"回到主线程");
}

3.打印结果第二步在前,不符合要求


使用GCD 信号量控制后-----大笑

1.在异步请求之前设置信号量为0,然后再第一步请求之后让线程一直等待

- (void)requestAction:(UIButton *)btn{
    NSLog(@"开始请求-----------");
    dispatch_queue_t queque = dispatch_queue_create("miximixi", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(queque, ^{
        dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
        [self firstRequestWithSemaphore:semaphore];
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        [self secondRequest];
    });
    NSLog(@"回到主线程");
}

2.然后第一步请求结束之后,再发送信号量,解除等待

// 第一步请求
- (void)firstRequestWithSemaphore:(dispatch_semaphore_t)semaphore{
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        NSLog(@"请求第一步");
        dispatch_semaphore_signal(semaphore);
    });
}

3.打印结果永远是第一步先请求

小结:

在第一步请求之前需要先设置信号量为0;

第二步请求之前设置等待(时间设置为永久等待,相当于上锁,线程到这里就无法执行);

等到第一步请求完成后,发送信号量,值自动+1,解除等待,继续往下执行第二步请求。




解决若依Vue3前后端分离---路由切换时显示白屏 解决基于Vue3若依前后端分离项目中出现的路由正常切换但是就是不显示数据的问题,也就是不发起网络请求的问题。 阅读详情

相关推荐

openEuler 22.03 安装 openGauss 5.0.2 部署手册

openEuler 22.03 安装 openGauss 5.0.2 部署手册

全国服务器高效代维 1422

【iOS】——GCD总结

此时就形成了主队列中的任务需要等待将任务添加到队列的这个操作的任务执行完才能进行,而将任务添加到队列这个操作需要等待主线程上的任务执行完才能进行,形成了主队列和主线程相互等待的局面,造成了死锁。如果是同步执行之后再进行异步操作,虽然开启了新线程,但是同步执行的任务在开启新线程之前就已经全部执行完了,这个新线程只负责处理异步操作中的任务,也就是同步执行的还是顺序,异步执行的是乱序。GCD中的队列有串行队列和并发队列,都是采用FIFO原则,也就是创建的新任务总是在队尾,执行的当前任务总是从队头开始。

m0_73974920的博客 1149

稳定性仿真(stb闭环增益仿真)

stb仿真主要是测试电路的稳定性,例如运放在闭环电路中的增益和相位裕度的值,从而判别电路是否正常工作。 以下是stb仿真的过程: (1)调用iprobe器件 从analogLib中调iprobe器件,通过器件中的箭头标识确定接入电路的方法,箭头起点端连运放的输出端,箭头的终点端连在反馈环路的作用端。iprobe器件连入电路后相当于理想导线。(iprobe器件连接在反馈回路上) (2)analyses设置 勾选stb和frequency,此处的频率范围设置在0.1~1GHz,Probe Instance/T

qq_36686804的博客 3万+

基于MP2642GR-Z和PIC18F4680的2S电池主动均衡方案设计

锂电池成组使用时,电芯不一致问题不可避免,容量、内阻与自放电的差异会随循环累积,导致过充、欠放和安全隐患。传统被动均衡仅靠电阻耗散能量,效率低、发热大,难以满足储能与备用电源的长期可靠性需求。主动均衡通过功率变换实现能量双向转移,将高电压电芯的能量搬运至低电压电芯,在提升系统可用容量的同时显著延长电池组寿命。本文从同步降压拓扑与MCU控制的视角,介绍一种基于MP2642GR-Z同步降压芯片与PIC18F4680单片机的高效2S电池主动均衡方案,涵盖硬件架构、电压采样、均衡策略及调试要点,适用于便携式储能、小

weixin_33804582的博客 286

川崎机器人 AS语言基础运动指令表

    功能简介 动作方式 参考坐标系 位置特性 X,Y,Z 角度特性 O,A,T 指令格式(距离单位毫米,时间单位秒,角度单位度 示例1 示例2 运 动 指 令 JMOVE 以关节移动到目标点 关节移动方式 基础坐标系 不受控 伪随机动作 JMOVE 目标点 JMOVE #yd JMOVE put1 LMOVE 以直线移动到目标点 直线移动方式

喜欢自学并分享经验的技术宅 9346

手把手教你用MaxEnt+ArcGIS玩转物种分布预测

本文详细介绍了如何利用MaxEnt最大熵模型与ArcGIS软件进行物种分布预测。通过实战案例,从数据收集、环境变量处理、模型参数设置到结果可视化分析,手把手教你掌握生态位模型的核心流程。结合SDM toolbox插件,可高效完成数据预处理与高级空间分析,是生态学与保护生物学研究的实用指南。

weixin_29309475的博客 559

使用信号量使AFNetworking异步变同步(dispatch_semaphore_t)

背景 当H5调用OC的时候,默认是在主线程的,如果H5调用后,需要原生返回数据,而原生获取数据又是个耗时的异步操作就会有问题,比如OC是一个网络请求,那就需要等原生请求返回后,再返给H5。 当然可以在网络请求返回的时候,调用H5的一个方法,但是觉得这样的实现方式有点low,所以还是想把网络请求改成同步,这样就可以解决这个问题了。 使用信号量来实现 信号量的介绍 正常的使用顺序是先降低然后再提...

ljmios的博客 646

WPF中使用TreeView封装组合控件TreeView+DataGrid

wpf的功能非常强大,很多控件都是原生的,但是要使用TreeView+DataGrid的组合,就需要我们自己去封装实现。功能如上图所示, 目前基本上把常用的样式都实现了,购买源码后,可以自行修改样式。本文源码效果如下,(搞了好几天,的确有难度,所以源码也收费,便宜,赚点辛苦费)第一种:技术的选择是TreeView(也就是本文的演示)。这2个图都是第三方控件自带的,并且都是收费使用。首先说明一下,实现上面的效果,有3种方法。本文演示的是使用TreeView的实现。第二种:技术的选择是DataGrid。

故里2130 1650

ios dispatch_semaphore是GCD用来同步的一种方式

联系人:石虎  QQ: 1224614774 昵称:嗡嘛呢叭咪哄 dispatch_semaphore是GCD用来同步的一种方式,与他相关的共有三个函数,分别是 dispatch_semaphore_create, dispatch_semaphore_signal, dispatch_semaphore_wait。 下面我们逐一介绍三个函数: 1.dispat

石虎 1432

GEE:大面积研究区域数据分块导出,以解决内存限制和导出失败的问题

本文介绍了在Google Earth Engine (GEE)平台分块导出大面积研究区域数据的方法。针对直接导出大区域影像易失败的问题,作者提出通过网格分块技术进行处理。文章展示了完整的JavaScript代码示例,包含定义研究区域、加载ESA WorldCover数据集、设置分块参数(包括像素大小、分块尺寸)、创建网格系统、处理坐标转换等关键步骤。代码中还提供了错误处理和导出按钮功能,确保数据能可靠地分块导出到Google Drive。该方法有效解决了大区域数据导出时的内存限制问题,适用于全球范围的研究。

养乐多的博客 1184

Exchange Server 2013 运维系列——邮箱配额设置(管理中心)

邮箱配额需要设置三个参数: 1、发出警告限制:表示在向用户发出警告之前的最大存储限制。如果邮箱大小达到或超过指定值,Exchange 将向邮箱用户发送警告消息。 2、禁止发送限制:表示邮箱的“禁止发送”限制。如果邮箱大小达到或超过指定的限制,Exchange 将阻止邮箱用户发送新邮件,并显示一条描述性错误消息。 3、禁止发送和接收限制:表示此邮箱的“禁止发送和接收”限制。如果邮箱大小

白昼的技术专栏 1万+

GCD的简单使用——图片的下载及展示

GCD异步下载图片及显示的几种常见的方法。

人生如戏 戏如人生 1635

DeerFlow 系列教程 第十四篇 | IM 渠道集成——让 DeerFlow 接入飞书、企微、Slack、Telegram

DeerFlow 系列教程 第十四篇本篇教程继续,全面剖析 DeerFlow 的 IM 渠道集成方案。我们将深入理解 Channel 抽象层设计、MessageBus 消息总线机制、ChannelManager 调度循环、四大 IM 平台(飞书、企业微信、Slack、Telegram)的适配实现,以及从 IM 消息到 Agent 响应再到 IM 回复的完整消息流转过程。

weixin_43674738的博客 414

GCD 高级特性解析:dispatch_group、dispatch_semaphore 与 barrier 的巧妙运用

Grand Central Dispatch(GCD)作为 Apple 开发的多核并发技术,为开发者提供了强大的任务调度能力。本文将深入解析 GCD 中三个高级特性——dispatch_group、dispatch_semaphore 和 barrier,帮助你掌握这些工具的使用技巧,轻松应对复杂的并发场景。 ## dispatch_group:任务协同的终极方案 dispatch_group

gitblog_01049的博客 869

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

GCD(四) dispatch_semaphore

本文是GCD多线程编程中dispatch_semaphore内容的小结,通过本文,你可以了解到: 信号量的基本概念与基本使用 信号量在线程同步与资源加锁方面的应用 信号量释放时的小陷阱 今天我来讲解一下dispatch_semaphore在我们平常开发中的一些基本概念与基本使用,dispatch_semaphore俗称信号量,也称为信号锁,在多线程编程中主要用于控制多线程下访问资源的数量,比如...

weixin_34107739的博客 461

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

GCD信号量(dispatch_semaphore)

上一讲我们谈到可以使用GCD调度组来实现异步处理完成后最后回到某个线程后集中处理(多接口异步请求.回到主线程刷新UI).戳:GCD调度组(dispatch_group) 这一讲我们来谈一个也能实现该需求的GCD信号量(Semaphores) 主要就是下面几个东西 // dispatch_semaphore_t // dispatch_semaphore_create(<#l...

MeteoriteMan的博客 760

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

GCD信号量—dispatch_semaphore详解与使用

一 什么是信号量? dispatch_semaphore信号量是一种基于计数器的一种多线程同步机制。 简单来说就是控制访问资源的数量,比如系统有两个资源可以被利用,同时有三个线程要访问,只能允许两个线程访问,第三个应当等待资源被释放后再访问。注意:再GCD中,只有调度的线程在信号量不足的时候才会进入内核态进行线程阻塞。二 如何使用信号量? 主要三个函数: dispatch_semaph

SL_ideas的博客 1651

深入理解GCD之dispatch_semaphore

原文链接深入理解GCD之dispatch_semaphore 再研究完dispatch_queue之后,本来是打算进入到dispath_group的源码,但是dispath_group基本是围绕着dispatch_semaphore即信号量实现的,所以我们先进入到dispatch_semaphore的源码学习。在GCD中使用dispatch_semaphore用来保证资源使用的安全性(队列的同步执...

weixin_34352005的博客 488

dispatch_semaphore_t的使用

1. dispatch_semaphore_create =&gt; 创建一个信号量的初始值 传入的参数为long,输出一个dispatch_semaphore_t类型且值为value的信号量。 值得注意的是,这里的传入的参数value必须大于或等于0,否则dispatch_semaphore_create会返回NULL。      2. dispatch_semaphore_signal =&...

u012380572的博客 1718

GCD全解-dispatch-多个网络请求处理

1、问题 2、解决方案 2.1、一般方式:不做任何处理连续请求多个协议 2.2、GCD队列组:dispatch_group_t 2.3、GCD信号量:dispatch_semaphore_t 2.4、GCD信号量实现GCD队列组功能(不推荐)

chenzimin_blog 1083

dispatch_semaphore的使用

转载请注明出处http://www.cnblogs.com/snailHL/p/3906112.htmldispatch_semaphore是GCD用来同步的一种方式,与他相关的共有三个函数,分别是dispatch_semaphore_create,dispatch_semaphore_signal,dispatch_semaphore_wait。下面我们逐一介绍三个函数:(1)dispatch_s

Setoge的博客 590

iOS多线程开发—— GCD dispatch_semaphore 信号量

在GCD中提供了一种信号机制,也可以解决资源抢占问题(和同步锁的机制并不一样)。 GCD中信号量是dispatch_semaphore_t类型,支持信号通知和信号等待。每当发送一个信号通知,则信号量 +1,每当发送一个等待信号时信号量 -1。如果信号量为0则信号会处于等待状态,直到信号量大于0开始执行。根据这个原理我们可以初始化一个信号量变量,默认信号量设置为1,每当有线程进入“加锁代码”之后就

xiao__L的博客 1278

iOS使用dispatch_group实现分组并发网络请求

前言 在实际开发中我们通常会遇到这样一种需求:某个页面加载时通过网络请求获得相应的数据,再做某些操作。有时候加载的内容需要通过好几个请求的数据组合而成,比如有两个请求A和B,我们通常为了省事,会将B请求放在A请求成功的回调中发起,在B的成功回调中将数据组合起来,这样做有明显的问题: 请求如果多了,需要写许多嵌套的请求 如果在除了最后一个请求前的某个请求失败了,就不会执行后面的请求,数据...

li198847的博客 3045

【iOS】GCD学习

GCD是iOS开发中非常重要的一个内容,在此作一个总结。GCD全称Grand Central Dispatch,是异步执行任务的技术之一。一般将应用程序中记述的线程管理用的代码在系统及中实现。开发者只需要定义想执行的任务并追加到适当的调度队列中,GCD就能生成必要的线程并计划执行任务。由于线程管理是作为系统的一部分来实现的,因此可以统一管理,也可执行任务,这样会比以前的线程更有效率。仅一行代码就能表示让处理在后台线程中执行。那么为什么使用GCD?

2401_87841908的博客 1123

关于dispatch_semaphore的使用

转载请注明出处http://www.cnblogs.com/snailHL/p/3906112.html dispatch_semaphore是GCD用来同步的一种方式,与他相关的共有三个函数,分别是 dispatch_semaphore_create,dispatch_semaphore_signal,dispatch_semaphore_wait。 下面我们逐一介绍三个函数: ...

ak3511016的博客 306

GDC dispatch_semaphore

当我们在处理一系列线程的时候,当数量达到一定量,在以前我们可能会选择使用NSOperationQueue来处理并发控制,但如何在GCD中快速的控制并发呢?答案就是dispatch_semaphore,对经常做unix开发的人来讲,我所介绍的内容可能就显得非常入门级了,信号量在他们的多线程开发中再平常不过了。   信号量是一个整形值并且具有一个初始计数值,并且支持两个操作:信号通知和等待。当一个信

1万+
上一篇: UITextField 监听数值变化的三种方法
下一篇: 使用TableView自带的多选功能
RockyFung
博客等级 码龄11年 3粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值