在NSURLSessionTask发起网路请求时,一般是异步操作,如果需要进行同步等待的话,可采用dispatch_semaphore_t信号量基于计数器的一种多线程同步机制。但是在多个线程访问共有资源时候,会因为多线程的特性而引发数据出错的问题,需要慎重使用。

关于dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); 如果semaphore计数大于等于1,计数减一,返回,程序继续运行。如果计数为0,则等待。这里设置的等待时间是一直等待。

dispatch_semaphore_signal(semaphore);计数加1.在这两句代码中间的执行代码,每次只会允许一个线程进入,这样就有效的保证了在多线程环境下,只能有一个线程进入。

        NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL:[NSURL URLWithString:URLSring] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30];

        dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);

        NSURLSessionTask *dataTask = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (!error && data) {
self.responseMsg = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
} else {
NSLog(@"error: %@",[error description]);
}
dispatch_semaphore_signal(semaphore);
}];
[dataTask resume]; dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

NSURLSessionTask使用dispatch_semaphore 完成同步机制的更多相关文章

  1. .NET Core采用的全新配置系统[10]: 配置的同步机制是如何实现的?

    配置的同步涉及到两个方面:第一,对原始的配置文件实施监控并在其发生变化之后从新加载配置:第二,配置重新加载之后及时通知应用程序进而使后者能够使用最新的配置.要了解配置同步机制的实现原理,先得从认识一个 ...

  2. Linux的原子操作与同步机制

    Linux的原子操作与同步机制   .进程1执行完“mov eax, [count]”后,寄存器eax内保存了count的值0.此时,进程2被调度执行,抢占了进程1的CPU的控制权.进程2执行“cou ...

  3. windows核心编程 - 线程同步机制

    线程同步机制 常用的线程同步机制有很多种,主要分为用户模式和内核对象两类:其中 用户模式包括:原子操作.关键代码段 内核对象包括:时间内核对象(Event).等待定时器内核对象(WaitableTim ...

  4. 锁相关知识 & mutex怎么实现的 & spinlock怎么用的 & 怎样避免死锁 & 内核同步机制 & 读写锁

    spinlock在上一篇文章有提到:http://www.cnblogs.com/charlesblc/p/6254437.html  通过锁数据总线来实现. 而看了这篇文章说明:mutex内部也用到 ...

  5. Java中的闪光点:ThreadLocal是线程Thead的局部变量,可替代同步机制的设计,值得学习和研究

    线程局部变量ThreadLocal,是Java支持的一种线程安全机制,目的是解决多线程的并发问题. 具体来讲,就是多个线程访问该实例对象的变量时,该实例对象将其存储为键值对的形式,保证各个线程(键)分 ...

  6. 分析.Net里线程同步机制

    我 们知道并行编程模型两种:一种是基于消息式的,第二种是基于共享内存式的. 前段时间项目中遇到了第二种 使用多线程开发并行程序共享资源的问题 ,今天以实际案例出发对.net里的共享内存式的线程同步机制 ...

  7. java并发:线程同步机制之ThreadLocal

    1.简述ThreadLocal ThreadLocal实例通常作为静态的私有的(private static)字段出现在一个类中,这个类用来关联一个线程.ThreadLocal是一个线程级别的局部变量 ...

  8. java并发:线程同步机制之计数器&Exechanger

    第一节 CountDownLatch (1)初识CountDownLatch (2)详述CountDownLatch CountDownLatch是通过一个计数器来实现的,计数器的初始值为线程的数量. ...

  9. [内核同步]浅析Linux内核同步机制

    转自:http://blog.csdn.net/fzubbsc/article/details/37736683?utm_source=tuicool&utm_medium=referral ...

随机推荐

  1. 为动态添加的元素,绑定click事件

    全选和取消全选 $("#quanxuan").click(function(){ $("input[name='picCheck']").prop(" ...

  2. 【Alpha】Daily Scrum Meeting第七次

    一.本次Daily Scrum Meeting主要内容 各队员的任务完成情况 文件选择器布局只是暂时使用,后期会改方式,放在后面解决. 接下去都要做什么 二.项目进展 学号尾数 今日已完成任务 接下去 ...

  3. Docker对普通开发者的用处(转)

    有些开发者可能还是不明白 Docker 对自己到底有多大的用处,因此翻译 Docker 个人用例 这篇文章中来介绍 Docker 在普通开发者开发过程中的用例. Docker 如今赢得了许多关注,很多 ...

  4. Cocos引擎开发者指南(1-5)

    Cocos引擎开发者指南 英文原版:http://www.cocos2d-x.org/docs/programmers-guide/1/ 中午翻译:http://www.cocos.com/doc/t ...

  5. js 滚动的文字(走马灯)

    // 滚动的文字 function marqueeScroll() { //var $target = $(".marquee_outer:visible"); if($(&quo ...

  6. crontab执行时间和系统时间不一致

    最近发现一个非常奇怪的问题,症状如下: crontab 定时任务 配置时间 是 10 5 * * * (每日凌晨5点10分执行) 运行脚本时间却是 18:10左右 Dec 24 05:10:01 ht ...

  7. Oracle 语法

    1.行转列函数 11gR2以前: WM_CONCAT函数, 使用方式形如: SELECT SUS_SNO,WM_CONCAT(SRC_FILENAME) AS AAA FROM AML_SUS_TRD ...

  8. PCB板的质量可接受性标准 IPC-A-600H 中文版下载

    对于电子行业的小伙伴来说,经常要找PCB板厂打板,总难免遇到跟板厂因PCB上的质量缺陷扯皮的时候,这是就要有一份公认PCB质量可接受性标准作为最终PCB产品的验收标准,即IPC-A-600标准规范. ...

  9. bootstrap插件引用

    若按照步骤报这种错误,从这几方面进行排错 1.引用css/js的顺序 2.是否以及引入相应的包 3.是否正确调用(此处需要注意有require.js的情况,要不把switch方法写入require里面 ...

  10. 无法安装MVC3,错误提示:安装KB2483190(vs10-kb2483190)出错

    原文:无法安装MVC3,错误提示:安装KB2483190(vs10-kb2483190)出错 无法安装MVC3,错误提示:安装KB2483190(vs10-kb2483190)出错. 安装指导:&qu ...