当前位置: 首页 > 编程日记 > 正文

05-dispatch_semphore

dispatch_semphore 信号量

dispatch_semaphore信号量为基于计数器的一种多线程同步机制。如果semaphore计数大于等于1,计数-1,返回,程序继续运行。如果计数为0,则等待。dispatch_semaphore_signal(semaphore)为计数+1操作,dispatch_semaphore_wait(sema,
DISPATCH_TIME_FOREVER)为设置等待时间,这里设置的等待

三个方法:

  • 1 创建信号

    dispatch_semaphore_t sem = dispatch_semaphore_create(0);

  • 2 发送一个信号,让信号量进行+1操作
    dispatch_semaphore_signal(sem);

  • 3 是总信号-1的操作,当信号量为0的时候,会阻塞线程
    dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);

使用示例:

- (IBAction)loadDataBtnClick:(id)sender {// 去下载图片,等待所有的图片下载完成 去进行展示// 因此就有了一个同步的概念NSArray *imgUrlArr = @[@"http://g.hiphotos.baidu.com/image/h%3D220/sign=25515a55865494ee9822081b1df4e0e1/c2fdfc039245d68802b0694eaec27d1ed31b24ae.jpg",@"http://h.hiphotos.baidu.com/image/pic/item/d4628535e5dde711e70b7e1dadefce1b9c16617b.jpg",@"http://g.hiphotos.baidu.com/image/pic/item/95eef01f3a292df54e6346fbb6315c6035a873b8.jpg"];// 创建一个 semaphore 基于计数器的一种多线程同步机制。dispatch_semaphore_t sem = dispatch_semaphore_create(0);//for (int i = 0; i < imgUrlArr.count; i ++) {// 执行任务一 操作NSURL *url = [NSURL URLWithString:imgUrlArr[i]];NSURLRequest *req = [NSURLRequest requestWithURL:url];NSURLSessionDataTask *task = [self.session dataTaskWithRequest:req completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {if (!error) {// 没有错误 请求成功UIImage *image = [UIImage imageWithData:data];[_succImgArr addObject:image];NSLog(@"download %d img success",i);}else{NSLog(@"error happend");}// 当最后一次回调 后再发信号量,使程序继续执行if (i == 2) {// 计数加一的操作dispatch_semaphore_signal(sem);NSLog(@"%lu",(unsigned long)self.succImgArr.count);}}];[task resume];}// 等待完成 信号量不为0 程序继续执行dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);dispatch_async(dispatch_get_main_queue(), ^{NSLog(@"end");_firstShowImgView.image = self.succImgArr[0];_secondShowImgView.image = self.succImgArr[1];_thirdShowImgview.image = self.succImgArr[2];NSLog(@"%lu",(unsigned long)self.succImgArr.count);});/*输出结果:
2017-12-08 10:16:00.605357+0800 SKNetDemo[32281:6366178] download 0 img success
2017-12-08 10:16:00.607327+0800 SKNetDemo[32281:6366178] download 1 img success
2017-12-08 10:16:00.608976+0800 SKNetDemo[32281:6366178] download 2 img success
2017-12-08 10:16:00.609852+0800 SKNetDemo[32281:6366178] 3
2017-12-08 10:16:00.611645+0800 SKNetDemo[32281:6366139] end
2017-12-08 10:16:00.612564+0800 SKNetDemo[32281:6366139] 3*/}

相关文章:

[leetcode]_Integer to Roman

题目&#xff1a;对应之前那道将罗马数字转换整型数字的题目。反过来。 思路&#xff1a;刚开始做的时候&#xff0c;想着用程序进行判断&#xff0c;复杂的要死。网络了别人代码&#xff0c;非常清晰。 代码&#xff1a; 1 public String intToRoman(int num) {2 S…

fiddler使用技巧进阶,如何抓包修改数据?——AutoResponder重定向

“ 介绍Fiddler的AutoResponder重定向功能。” Fiddler功能十分强大&#xff0c;既能抓取报文&#xff0c;也能构造报文&#xff0c;本文继续介绍fiddler的功能&#xff0c;这次的功能与构造报文相关&#xff0c;用来回答标题中的疑问&#xff0c;即修改数据的方法&#xff0c;…

nginx基于IP的虚拟主机

知识点&#xff1a; server的语法&#xff1a; upstream语法&#xff1a; upstream中192.168.100.1不是ip只是个标识&#xff0c;只要和下面的proxy_pass 对应即可。 基于IP的虚拟主机&#xff1a; listen和server_name中多加上端口也没问题 listen可以监听在虚拟ip上面 代码&a…

读《人月神话》所感

《人月神话》 读书心得&#xff1a;因为现在还是学生&#xff0c;且没有什么真正在应用项目的开发经验&#xff0c;所以读《人月神话》这本书&#xff0c;与其说是在学习这位计算机先驱的经验&#xff0c;不如说是在了解一个大型软件系统的开发过程以及在开发过程中将会遇到的…

Android逆向之调试smali代码基础

点击上方↑↑↑蓝字[协议分析与还原]关注我们 “ 介绍Android逆向中调试smali代码的方法。” 最近在重整Android逆向分析环境&#xff0c;一切都在从零开始&#xff0c;做下记录&#xff0c;给大家分享。 本文介绍Android逆向中smali代码的调试及环境的准备。 事先准备如下工具…

Python之路【第五篇】:面向对象及相关

Python之路【第五篇】&#xff1a;面向对象及相关 Python之路【第五篇】&#xff1a;面向对象及相关 面向对象基础 基础内容介绍详见一下两篇博文&#xff1a; 面向对象初级篇面向对象进阶篇其他相关 一、isinstance(obj, cls) 检查是否obj是否是类 cls 的对象 123456class Foo…

关于安卓版的eclipse连接数据库并誓言增删改查

在安卓环境下连接数据库下面是主要代码极其作用&#xff1a; 1.编写 The Class类把课程表courses.db当做一个实体类&#xff0c;hashcode和equals这两个类是为了判断输入的查询内容和Excel表中的内容是否一致。 并在java里面区别两个对象是否一致 1 public class TheClass {2 …

07-主队列和全局队列

GCD 会主动的提供一个队列供开发者使用。 主队列 系统提供的串行队列 是在主线程执行的队列&#xff0c;所以是串行的队列。任务一个个执行。 dispatch_get_main_queue() 全局队列 系统提供的并发队列 全局队列是所有应用程序都能够使用的并发队列&#xff0c;不需要手动的创…

Android逆向--如何调试smali代码?

最近在重整Android逆向分析环境&#xff0c;一切都在从零开始&#xff0c;做下记录&#xff0c;给大家分享。 本文介绍Android逆向中smali代码的调试及环境的准备。 事先准备如下工具&#xff1a; Android killer&#xff1a;反编译APK应用为smali源码的工具 Android studi…

python -socket -client

socket client 发起连接。 流程为&#xff1a; 创建接口 发起连接 创建接口参数同socket server相同 发起连接的函数为socket.connect(ip,port) 这个地方的ip与port为socket server端的ip和监听port。 代码示例&#xff1a; # -*- coding: utf-8 -*-This is a testing program …

mysql的binlog太多太大占用了空间的解决办法

现象&#xff1a;网站访问越来越慢&#xff0c;最后无法访问了&#xff0c;经过检查发现磁盘满了 分析过程及解决方案&#xff1a;通常出现这种问题都应该登录服务器检查磁盘、内存和进程使用的情况&#xff0c;通过top、df –h和free –m来检查&#xff0c;发现磁盘空间满了。…

08-dispatch_apply

1 dispatch_apply dispatch_apply 是按照指定的次数将指定的block 添加到指定的queue当中去。 可以用于快速的迭代 // 获取全局并发队列dispatch_queue_t queue dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);// 迭代数组NSLog("begin");NSArra…

记一次知乎维权过程——严肃批评某非法引流商

“ 我的文章被人盗版了。” 首先请关注本号的云技术君的马甲赶快取关&#xff0c;这里不欢迎你&#xff0c;你如果再抄我的文章去干坏事&#xff0c;你全家得新冠肺炎。 文章被盗版&#xff0c;被洗稿&#xff0c;且用来给菠菜党引流&#xff0c;我很生气。 好了&#xff0c…

《代码大全2》读后感czz

经老师推荐&#xff0c;买了一本《代码大全2》&#xff0c;花了近3个月的时间看完了&#xff0c;看完后觉得还有很多值得回味的地方&#xff0c;而且每部分之后作者还推荐了不少经典书籍。所以&#xff0c;作个读书心得。全书的主题是软件构建&#xff0c;关于软件构建问题的方…

09-dispatch_source

dispatch_source 是BSD系内核惯有的kqueue的包装&#xff0c;kqueue 是XNU内核中发生各种事件时&#xff0c;在应用程序编程中执行处理的技术。 CPU 负荷非常小&#xff0c;尽量不占用资源。 dispatch_queue 和dispatch_source dispatch_source 是可以取消的&#xff0c;取…

如何获取boss直聘搜索牛人被屏蔽的姓名

点击上方↑↑↑蓝字[协议分析与还原]关注我们“ 玩玩boss直聘。”最近在用boss直聘&#xff0c;活跃度估计蛮高的。在使用牛人搜索的时候&#xff0c;却遇到了一个问题&#xff0c;就是搜出的牛人姓名是被屏蔽的&#xff0c;让我很是焦虑&#xff0c;虽然知道这种设计是直聘推广…

【Python之路】第二篇--初识Python

Python简介 Python可以应用于众多领域&#xff0c;如&#xff1a;数据分析、组件集成、网络服务、图像处理、数值计算和科学计算等众多领域。目前业内几乎所有大中型互联网企业都在使用Python&#xff0c;如&#xff1a;Youtube、Dropbox、BT、Quora&#xff08;中国知乎&…

如何实现phpcms v9_4X版本tag的伪静态?

这两个月来写的文章越来越少了&#xff0c;不是懒&#xff0c;因为太忙了--为客户赶做网站。因为客户指定要使用phpcms v9,还要求使用phpcms v9_42版本实现tag伪静态&#xff0c;在接手的时候phpcms v9_42是最新版本&#xff0c;而现在phpcms官方已经发布phpcms v9_5.X了。对于…

OC对象内存布局

OC对象的内存布局 1 每一个实例对象&#xff08;Instance&#xff09;内部都有一个isa指针&#xff0c;指向它的类对象&#xff0c;类对象存放着本对象的实例方法列表和成员变量列表。 2 类对象(Class)内部也有一个isa指针指向元类对象(MetaClass)&#xff0c;元类对象存放的事…

连信的protobuf数据格式

点击上方↑↑↑蓝字[协议分析与还原]关注我们“ 连信里用到的protobuf结构。”在看本文之前&#xff0c;可以先进行一下回顾&#xff0c;之前已经对协议的框架进行了整体的介绍&#xff1a;连信协议整体框架看了后结合自己的分析过程&#xff0c;应该有个初步的了解。后续会陆续…

fileupload控件在ajax中无法使用

google得到的方法&#xff1a;1。http://geekswithblogs.net/ranganh/archive/2008/04/01/file-upload-in-updatepanel-asp.net-ajax.aspxThere is a better way of doing it with Ajax Control Toolkit version 3.0.30930 which works with .NET 3.5 SP1 and Visual Studio 20…

Cron表达式的详细用法

字段 允许值 允许的特殊字符 秒 0-59 , - * / 分 0-59 , - * / 小时 0-23 , - * / 日期 1-31 , - * ? / L W C 月份 1-12 或者 JAN-DEC , - * / 星期 1-7 或者 SUN-SAT , - * ? / L C # 年&#xff08;可选&#xff09; 留空, 1970-2099 , - * / 例子&#xff1a;0/5 * * * *…

01-CoreData 概述

CoreData 主要的几个类 1 概述 CoreData 是iOS 3 之后出现的一种数据持久化方案&#xff0c;提供了一种ORM的存储关系&#xff0c;CoreData 是直接将对象存储到数据库中去&#xff0c;也可以将数据库中的数据转化为OC对象&#xff0c;过程中不用编写SQL语句。 2 几个类的讲解…

连信的会话加密密钥协商过程

点击上方↑↑↑蓝字[协议分析与还原]关注我们 “ 介绍连信会话加密密钥的协商过程。” 公号内之前已经对协议的框架和协议内的数据格式进行了介绍&#xff0c;有需要可以回顾下&#xff1a; 连信协议整体框架 连信的protobuf数据格式 本文对连信的会话加密密钥协商过程进行介绍…

6、UmbracoNewsSite:添加新闻分类

上一篇做了一个简单的首页&#xff0c;在导航条上添加了几个新闻板块&#xff0c;接下来我们就添加这几个新闻板块的页面。 开始我们还是需要创建Document Types用来展示新闻列表。我们先做好规划&#xff0c;新闻列表只需要把新闻标题和图片展示出来就可以了&#xff0c;。  …

02-CoreData 的增删改查

CoreData 的增删改查 基本的增删改查的操作 1 数据库的创建 - (void)createDB {// 1.1 创建路径NSURL *modelURL [[NSBundle mainBundle] URLForResource:"AT_CoreDataDemo1" withExtension:"momd"];// 1.2 根据模型文件路径创建模型对象NSManagedObje…

Lemon开源OA

http://www.mossle.com/index.html 转载于:https://www.cnblogs.com/gzmg/p/3770882.html

UC浏览器代理流量解密

点击上方↑↑↑蓝字[协议分析与还原]关注我们“ 解密uc浏览器的安全代理流量&#xff0c;看看是不是真安全。”作为一个从上古网络时代过来的人&#xff0c;一定对UC浏览器有深刻印象&#xff0c;它的流量透明代理功能&#xff0c;就是现在的云加速功能&#xff0c;使用UC的服务…

JAVA07 接口与继承

一 动手实验&#xff1a;继承条件下的构造方法调用 1&#xff09;源代码 1 public class TestInherits {2 3 public static void main(String[] args) {4 // TODO Auto-generated method stub5 6 Child c new Child();7 }8 9 } 10 11 class GrandPa…

学习-现代交换原理与通信技术

帮助学习细化。。。 首先&#xff0c;这书真是难读&#xff0c;像个词典嘛似乎《现代交换原理与通信技术》卞佳丽 北邮 呵呵 呵了个呵 不过词典也有词典的好处 第三章&#xff0c;数字程控电话交换与通信网络 1. 控制子系统 与 话路子系统 前者在于控制&#xff0c;后者在于数…