2017年,回望过去,前半年还致力于iOS开发,后半年就开始了python的漫漫之路,一路上走走停停,不过还好,总的来说,2017是收获的一年,也是付出的一年。2018加油!

话题转回来,关于线程执行的时候,大家可能会遇到一个问题,一个请求需要上一个请求的返回的数据作为参数,可是呢,你又想走异步操作,这时候问题就来了,还没有拿到上一个请求返回的参数,下一个请求已经开始操作了,就我而言的话,我会用三种方式进行:1.block回调,block的话直接block作为参数也可以实现  2. dispatch_semaphore_t(信号量) 3.dispatch_group_t  (组) 。关于Block的问题就不细说了,这里只说后两种

1.dispatch_semaphore_t(信号量)

这是需要用到的参数

/**
关于异步操作按照信号量的顺序进行一步步返回
* dispatch_semaphore_t 创建信号量,如果value小0 的话,这个信号量为空,
* dispatch_semaphore_wait 可以让信号量减1,如果信号量是0,会等到信号量为非0再次进行下一步操作
* dispatch_semaphore_signal 可以让信号量加1
* 可以使用sleep进行区分执行顺序
*/

这是基本使用,任务操作会按照你自己设定的顺序进行操作,sleep()只是为了区分

- (void)testDispatch_sempaphore {

    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
//进行异步操作
dispatch_async(dispatch_get_global_queue(0, 0), ^{ NSLog(@"异步操作1:%@", [NSThread currentThread]);
dispatch_semaphore_signal(semaphore);
}); //异步操作2
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
dispatch_async(dispatch_get_global_queue(0, 0), ^{
sleep(2);
NSLog(@"异步操作2:%@", [NSThread currentThread]);
dispatch_semaphore_signal(semaphore);
});
//异步操作3
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
dispatch_async(dispatch_get_global_queue(0, 0), ^{
sleep(3);
NSLog(@"异步操作3:%@", [NSThread currentThread]);
dispatch_semaphore_signal(semaphore);
}); }

2.dispatch_group_t  (组)

对于dispatch_group 大家都有了解,需要记得出入规则即可:先进先出

/**
* dispatch_queue_t 操作
* dispatch_group_t 任务组(进出规则:先进先出)
* dispatch_group_enter 添加任务
* dispatch_group_leave 任务完成
* dispatch_group_wait 对子线程阻塞式超时操作,也就是所谓的任务最大时长
* dispatch_enter和dispatch_leave要成对出现 */

这里需要注意一下,要将dispatch_group_enter和dispatch_group_leave结对使用

- (void)testDispatch_group {
//创建
dispatch_queue_t quete = dispatch_queue_create("baby", DISPATCH_QUEUE_CONCURRENT);
dispatch_group_t group = dispatch_group_create(); dispatch_group_enter(group);
dispatch_group_async(group, quete, ^{ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
sleep(5);
NSLog(@"使用dispatch_group1进行网络请求:%@", [NSThread currentThread]);
dispatch_group_leave(group);
});
sleep(2);
// dispatch_group_wait(group, dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5*NSEC_PER_SEC)));
NSLog(@"队列1完成任务1:%@", [NSThread currentThread]);
}); dispatch_group_enter(group);
dispatch_group_async(group, quete, ^{ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
sleep(5);
NSLog(@"使用dispatch_group2进行网络请求:%@", [NSThread currentThread]);
dispatch_group_leave(group);
});
sleep(2);
NSLog(@"完成任务2:%@", [NSThread currentThread]);
}); dispatch_group_enter(group);
dispatch_group_async(group, quete, ^{ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
sleep(5);
NSLog(@"使用dispatch_group3进行网络请求:%@", [NSThread currentThread]);
dispatch_group_leave(group);
});
sleep(2);
NSLog(@"完成任务3:%@", [NSThread currentThread]);
});
sleep(2);
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"最后执行 ---- %@", [NSThread currentThread]);
}); }

总结的也不一定全面,如有什么疑问,请加我扣扣:1123231279私聊我即可。

传送门:点击打开链接

iOS dispatch_semaphore_t(信号量)和 2.dispatch_group_t (组)的更多相关文章

  1. ios开发GCD(2)-dispatch_semaphore_t信号量计数器

    思考:现在有多个线程异步执行,我们想要同时最多只能执行2个或n个,该怎么办? dispatch_semaphore_t 看代码解析: NSLog(@"开始"); dispatch_ ...

  2. FreeRTOS 任务计数信号量,任务二值信号量,任务事件标志组,任务消息邮箱

    以下基础内容转载自安富莱电子: http://forum.armfly.com/forum.php 本章节为大家讲解 FreeRTOS 计数信号量的另一种实现方式----基于任务通知(Task Not ...

  3. GCD使用dispatch_semaphore_t创建多线程网络同步请求

    一.简介: dispatch_semaphore_t:表示信号,生成信号的方法是 dispatch_semaphore_t semaphore= dispatch_semaphore_create(0 ...

  4. iOS 多线程之线程锁Swift-Demo示例总结

    线程锁是什么 在前面的文章中总结过多线程,总结了多线程之后,线程锁也是必须要好好总结的东西,这篇文章构思的时候可能写的东西得许多,只能挤时间一点点的慢慢的总结了,知道了线程之后要了解线程锁就得先了解一 ...

  5. iOS开发系列-Lock

    概述 我们在使用多线程的时候多个线程可能会访问同一块资源,这样就很容易引发数据错乱和数据安全等问题,这时候就需要我们保证每次只有一个线程访问这一块资源,锁 应运而生. iOS中锁之前的性能的图标排行: ...

  6. μC/OS-II 信号量集

    简介 在实际应用中,任务常常需要与多个事件同步,即要根据多个信号量组合作用的结果来决定任务的运行方式.μC/OS-II 为了实现多个信号量组合的功能定义了一种特殊的数据结构--信号量集. 信号量集所能 ...

  7. 16.2-uC/OS-III同步 (事件标志组)

    事件标志组 1.当任务要与多个事件同步时可以使用事件标志.若其中的任意一个事件发生时任务被就绪, 叫做逻辑或(OR).若所有的事件都发生时任务被就绪,叫做逻辑与( AND). 2.用户可以创建任意个事 ...

  8. Linux多线程编程-信号量

    在Linux中.信号量API有两组.一组是多进程编程中的System V IPC信号量.另外一组是我们要讨论的POSIX信号量. 这两组接口类似,但不保证互换.POSIX信号量函数都已sem_开头,并 ...

  9. 【DSP开发】硬件信号量在多核处理器核间通信中的应用

    硬件信号量在多核处理器核间通信中的应用 刘德保1,汪安民1,韩道文2 1.同方电子科技有限公司研究所,九江 332009:2.解放军电子工程学院 摘要: 在多核处理器的软件设计中,核间通信机制是关键所 ...

随机推荐

  1. Django return

    return HttpResponse("OK") 返回一个字符串 return redirect("/index/") 返回URL return render ...

  2. idftp

    No FTP list parsers have been registered use IdAllFTPListParsers IdFTP1.List(LS); 中文目录乱码 2个步骤解决 use ...

  3. 干货!微信自动跳转默认浏览器下载app的方法!

    现在微信渠道可以说是拉新最快的渠道,因为微信具备强裂变性.但是目前微信对第三方下载链接的拦截是越来越严格了,那么想要在微信内肆无忌惮地推广链接就需要用到微信跳转浏览器的接口,那如何获取该接口呢?   ...

  4. Redis广播

    参见:http://blog.csdn.net/u011734144/article/details/51782085

  5. sphinx-2.1.9的安装使用

    1.下载/编译安装 cd /usr/local/src wget http://sphinxsearch.com/files/sphinx-2.1.9-release.tar.gz tar -xf s ...

  6. chrome浏览器和其它浏览器对scrollTop、scrollLeft的获取方法

    chrome浏览器不能通过document.documentElement.scrollTop来获得距上滚动距离,得到的值始终为0:需要用document.body.scrollTop来获取.其它浏览 ...

  7. [原创] debian 9.3 搭建seafile企业私有网盘

    [原创] debian 9.3 搭建seafile企业私有网盘 需求是这样的, 个人疲惫于 "成为大伙的文件中转站" ,公司不管大大小小的文件,都要打电话过来“转个xx文件”.“帮 ...

  8. nginx 做数据仓库时,location 404 Not Found,发现找不到要用的数据报:Not Found

    背景:  获得远程机器某个目录下的数据文件 方案:使用Nginx配置 1./home/ftp/www/ 下面有images 文件夹,为了访问images下面文件,配置Nginx如下: location ...

  9. CHD 5.15 安装 Kylin

    这里主要参考官网安装单机案例,并写入到脚本中.具体请看如下:      1.说明           这里采用的是root用户安装,但是运行时需要改一些配置,不然没有权限      2.安装     ...

  10. windows内核驱动内存管理之Lookaside使用

    Windows内存管理中使用了类似于容器的东西,叫做Lookaside对象,每次程序员申请内存都会从Lookaside里面申请,只有不足的时候,Lookaside才会向内存又一次申请内存空间,这样减少 ...