1.

dispatch_group_enter(group);

dispatch_group_leave(group);

dispatch_group_notify(group1, queue1,block);

在这种组合下,根据任务是同步、异步又分为两种,这两种组合的执行代码与运行结果如下:

第一种:同步任务时

  1. dispatch_queue_t queue2 = dispatch_queue_create("dispatchGroupMethod2.queue2", DISPATCH_QUEUE_CONCURRENT);
  2. dispatch_group_t group2 = dispatch_group_create();
  3.  
  4. dispatch_group_enter(group2);
  5. dispatch_sync(queue2, ^{
  6. for (NSInteger i =0; i<3; i++) {
  7. sleep(1);
  8. NSLog(@"%@-同步任务执行-:%ld",@"任务1",(long)i);
  9.  
  10. }
  11. dispatch_group_leave(group2);
  12. });
  13.  
  14. dispatch_group_enter(group2);
  15. dispatch_sync(queue2, ^{
  16. for (NSInteger i =0; i<3; i++) {
  17. sleep(1);
  18. NSLog(@"%@-同步任务执行-:%ld",@"任务2",(long)i);
  19.  
  20. }
  21. dispatch_group_leave(group2);
  22. });
  23.  
  24. // //等待上面的任务全部完成后,会往下继续执行 (会阻塞当前线程)
  25. // dispatch_group_wait(group2, DISPATCH_TIME_FOREVER);
  26.  
  27. //等待上面的任务全部完成后,会收到通知执行block中的代码 (不会阻塞线程)
  28. dispatch_group_notify(group2, queue2, ^{
  29. NSLog(@"Method2-全部任务执行完成");
  30. });

同步任务执行结果:

第二种:异步任务时

  1. dispatch_queue_t queue2 = dispatch_queue_create("dispatchGroupMethod2.queue2", DISPATCH_QUEUE_CONCURRENT);
  2. dispatch_group_t group2 = dispatch_group_create();
  3.  
  4. dispatch_group_enter(group2);
  5. dispatch_async(queue2, ^{
  6. for (NSInteger i =0; i<3; i++) {
  7. sleep(1);
  8. NSLog(@"%@-异步任务执行-:%ld",@"任务1",(long)i);
  9.  
  10. }
  11. dispatch_group_leave(group2);
  12. });
  13.  
  14. dispatch_group_enter(group2);
  15. dispatch_async(queue2, ^{
  16. for (NSInteger i =0; i<3; i++) {
  17. sleep(1);
  18. NSLog(@"%@-异步任务执行-:%ld",@"任务2",(long)i);
  19.  
  20. }
  21. dispatch_group_leave(group2);
  22. });
  23.  
  24. // //等待上面的任务全部完成后,会往下继续执行 (会阻塞当前线程)
  25. // dispatch_group_wait(group2, DISPATCH_TIME_FOREVER);
  26.  
  27. //等待上面的任务全部完成后,会收到通知执行block中的代码 (不会阻塞线程)
  28. dispatch_group_notify(group2, queue2, ^{
  29. NSLog(@"Method2-全部任务执行完成");
  30. });

异步任务执行结果:

https://www.cnblogs.com/zhou--fei/p/6747938.html

2.

创建一个信号量,作为全局变量。
并初始化,信号量为0

  1. dispatch_semaphore_t semaphore;
  2. semaphore = dispatch_semaphore_create(0);

创建一个dispatch_group_t,开启两个组异步线程(dispatch_group_async),分别执行两个网络请求。
一个组通知线程(dispatch_group_notify),用于接收前面两个线程的结果。

  1. dispatch_group_t group = dispatch_group_create();
  2. dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
  3. dispatch_group_async(group, queue, ^{
  4. [weakSelf loadRelationDetail];//请求1
  5. });
  6. dispatch_group_async(group, queue, ^{
  7. [weakSelf loadRelationReward];//请求2
  8. });
  9. dispatch_group_notify(group, queue, ^{
  10. dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
  11. dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
  12. //合并(此处是数据处理,你可根据具体业务需求进行处理)
  13. NSMutableArray *arr = [NSMutableArray array];
  14. [arr addObjectsFromArray:weakSelf.arr1];
  15. [arr addObjectsFromArray:weakSelf.arr2];
  16. //排序
  17. if (arr.count > 1) {
  18. weakSelf.sumArr = [arr sortedArrayUsingComparator:^NSComparisonResult(ZHShareItem *obj1, ZHShareItem *obj2) {
  19. return [obj1.createTime compare:obj2.createTime];
  20. }];
  21. }else{
  22. weakSelf.sumArr = arr;
  23. }
  24. //有数据刷新
  25. if (weakSelf.sumArr.count > 0) {
  26. //在主线程刷新页面
  27. dispatch_async(dispatch_get_main_queue(), ^{
  28. [weakSelf initTableView];
  29. });
  30. }
  31. });

https://www.jianshu.com/p/4e997f5deda9

3.afnetworking

为每一个NSURLSessionDownloadTask创建AFURLSessionManagerTaskDelegate,把请求的completionHandler也放在delegate。

从统一的回调didCompleteWithError到delegate的didCompleteWithError,再调用completionHandler返回。

  1. - (void)addDelegateForDownloadTask:(NSURLSessionDownloadTask *)downloadTask
  2. progress:(void (^)(NSProgress *downloadProgress)) downloadProgressBlock
  3. destination:(NSURL * (^)(NSURL *targetPath, NSURLResponse *response))destination
  4. completionHandler:(void (^)(NSURLResponse *response, NSURL *filePath, NSError *error))completionHandler
  5. {
  6. AFURLSessionManagerTaskDelegate *delegate = [[AFURLSessionManagerTaskDelegate alloc] init];
  7. delegate.manager = self;
  8. delegate.completionHandler = completionHandler;
  9.  
  10. if (destination) {
  11. delegate.downloadTaskDidFinishDownloading = ^NSURL * (NSURLSession * __unused session, NSURLSessionDownloadTask *task, NSURL *location) {
  12. return destination(location, task.response);
  13. };
  14. }
  15.  
  16. downloadTask.taskDescription = self.taskDescriptionForSessionTasks;
  17.  
  18. [self setDelegate:delegate forTask:downloadTask];
  19.  
  20. delegate.downloadProgressBlock = downloadProgressBlock;
  21. }

response

  1. - (void)URLSession:(NSURLSession *)session
  2. task:(NSURLSessionTask *)task
  3. didCompleteWithError:(NSError *)error
  4. {
  5. AFURLSessionManagerTaskDelegate *delegate = [self delegateForTask:task];
  6.  
  7. // delegate may be nil when completing a task in the background
  8. if (delegate) {
  9. [delegate URLSession:session task:task didCompleteWithError:error];
  10. ...
  11. //需要加锁
  12. - (AFURLSessionManagerTaskDelegate *)delegateForTask:(NSURLSessionTask *)task {
  13. NSParameterAssert(task);
  14.  
  15. AFURLSessionManagerTaskDelegate *delegate = nil;
  16. [self.lock lock];
  17. delegate = self.mutableTaskDelegatesKeyedByTaskIdentifier[@(task.taskIdentifier)];
  18. [self.lock unlock];
  19.  
  20. return delegate;
  21. }
  22.  
  23. ...
  24. //每一个delegate
  25.  
  26. #pragma mark - NSURLSessionTaskDelegate
  27.  
  28. - (void)URLSession:(__unused NSURLSession *)session
  29. task:(NSURLSessionTask *)task
  30. didCompleteWithError:(NSError *)error
  31. {
  32. #pragma clang diagnostic push
  33. #pragma clang diagnostic ignored "-Wgnu"
  34. __strong AFURLSessionManager *manager = self.manager;
  35.  
  36. __block id responseObject = nil;
  37.  
  38. __block NSMutableDictionary *userInfo = [NSMutableDictionary dictionary];
  39. userInfo[AFNetworkingTaskDidCompleteResponseSerializerKey] = manager.responseSerializer;
  40.  
  41. //Performance Improvement from #2672
  42. NSData *data = nil;
  43. if (self.mutableData) {
  44. data = [self.mutableData copy];
  45. //We no longer need the reference, so nil it out to gain back some memory.
  46. self.mutableData = nil;
  47. }
  48.  
  49. if (self.downloadFileURL) {
  50. userInfo[AFNetworkingTaskDidCompleteAssetPathKey] = self.downloadFileURL;
  51. } else if (data) {
  52. userInfo[AFNetworkingTaskDidCompleteResponseDataKey] = data;
  53. }
  54.  
  55. if (error) {
  56. userInfo[AFNetworkingTaskDidCompleteErrorKey] = error;
  57.  
  58. dispatch_group_async(manager.completionGroup ?: url_session_manager_completion_group(), manager.completionQueue ?: dispatch_get_main_queue(), ^{
  59. if (self.completionHandler) {
  60. self.completionHandler(task.response, responseObject, error);
  61. }
  62.  
  63. dispatch_async(dispatch_get_main_queue(), ^{
  64. [[NSNotificationCenter defaultCenter] postNotificationName:AFNetworkingTaskDidCompleteNotification object:task userInfo:userInfo];
  65. });
  66. });
  67. } else {
  68. dispatch_async(url_session_manager_processing_queue(), ^{
  69. NSError *serializationError = nil;
  70. responseObject = [manager.responseSerializer responseObjectForResponse:task.response data:data error:&serializationError];
  71.  
  72. if (self.downloadFileURL) {
  73. responseObject = self.downloadFileURL;
  74. }
  75.  
  76. if (responseObject) {
  77. userInfo[AFNetworkingTaskDidCompleteSerializedResponseKey] = responseObject;
  78. }
  79.  
  80. if (serializationError) {
  81. userInfo[AFNetworkingTaskDidCompleteErrorKey] = serializationError;
  82. }
  83.  
  84. dispatch_group_async(manager.completionGroup ?: url_session_manager_completion_group(), manager.completionQueue ?: dispatch_get_main_queue(), ^{
  85. if (self.completionHandler) {
  86. self.completionHandler(task.response, responseObject, serializationError);
  87. }
  88.  
  89. dispatch_async(dispatch_get_main_queue(), ^{
  90. [[NSNotificationCenter defaultCenter] postNotificationName:AFNetworkingTaskDidCompleteNotification object:task userInfo:userInfo];
  91. });
  92. });
  93. });
  94. }
  95. #pragma clang diagnostic pop
  96. }

第25月第26天 dispatch_group_t dispatch_semaphore_t的更多相关文章

  1. 25. TABLESPACES , 26. TABLE_CONSTRAINTS , 27. TABLE_PRIVILEGES

    25. TABLESPACES TABLESPACES表提供有关活动MySQL Cluster表空间的信息. TABLESPACES表有以下列: TABLESPACE_NAME :表空间名称 ENGI ...

  2. 第26月第26天 Domain=AVFoundationErrorDomain Code=-11850

    1. curl -voa http://119.29.108.104:8080/inweb01/kotlin.mp4 -H "Range:bytes=0-1" https://al ...

  3. 第25月25日 urlsession

    1. private lazy var session: URLSession = { let configuration = URLSessionConfiguration.default conf ...

  4. 第25月第22日 django channels

    1. https://github.com/andrewgodwin/channels-examples/ https://channels.readthedocs.io/en/latest/

  5. 第25月第18天 vue

    1.cnpm sudo chown -R $USER /usr/local  npm install -g cnpm --registry=https://registry.npm.taobao.or ...

  6. 第25月第17天 django rest framwork authentication /tmp/mysql.sock

    1.authentication https://www.django-rest-framework.org/api-guide/authentication/#authentication 2.dj ...

  7. 第25月第15天 udacity cs253

    1.cs253 https://classroom.udacity.com/courses/cs253 webapp2 Install WebOb, Paste and webapp2¶ We nee ...

  8. 第25月第11天 deeplearning.ai

    1.网易云课堂 深度学习工程师 点击进入课程地址(英文)(收费) 点击进入课程地址(中文)(免费) 第一门 神经网络和深度学习 第二门 改善神经网络 第三门 结构化机器学习项目 第四门 卷积神经网络 ...

  9. 第25月第9天 tf_tang_poems kaggle

    1.neural-style https://github.com/anishathalye/neural-style wget http://www.vlfeat.org/matconvnet/mo ...

随机推荐

  1. [ZJOI2018]历史

    [ZJOI2018]历史 最大化access轻重链的切换次数 考虑一个点的贡献,即它交换重儿子的次数 发现这个次数只和它自己ai以及每个儿子的子树次数和有关. 一个关键的事实是: 我们可以自上而下进行 ...

  2. 【NOIP数论内容整理】

    转载{大佬传送门} 附赠wakelin一句评论:日均二百七,全场rank1:千古神犇ZAY,吊打清华钟皓曦%%%

  3. 【洛谷P1164 小A点菜】

    题目背景 uim神犇拿到了uoi的ra(镭牌)后,立刻拉着基友小A到了一家……餐馆,很低端的那种. uim指着墙上的价目表(太低级了没有菜单),说:“随便点”. 题目描述 不过uim由于买了一些辅(e ...

  4. django引入模板时,部分css文件渲染不成功失灵引入不成功

    今天碰到了一件怪事,下载好的模板,在webstorm中就好好地,但是一引入到pycharm的django项目中就各种失灵,位置错乱. 检查一番,发现该设置的都设置对了啊,而且js文件和css文件还有一 ...

  5. spring cron表达式(定时器)

    转: spring cron表达式(定时器) 写定时器时用到,记录一下: Cron表达式是一个字符串,字符串以5或6个空格隔开,分开工6或7个域,每一个域代表一个含义,Cron有如下两种语法 格式:  ...

  6. 网速测试脚本speedtest_cli的安装与使用

    speedtest_cli的安装与使用 1.下载 wget https://raw.github.com/sivel/speedtest-cli/master/speedtest.py 图 1 2.授 ...

  7. 16.Linux-LCD驱动(详解)

    在上一节LCD层次分析中,得出写个LCD驱动入口函数,需要以下4步: 1) 分配一个fb_info结构体: framebuffer_alloc(); 2) 设置fb_info 3) 设置硬件相关的操作 ...

  8. Hbase学习03

    第3章 Hbase数据存储模型与工作组件 Data格式设计的的总体原则是按照需求要求,依据Hbase性能的相关标准规范和文件,并遵循“统一规范.统一数据模型.统一规划集群.分步实施”的原则,注重实际应 ...

  9. Idea中的一些快捷键

    最常用快捷键 sout 输出语句 psvm 输出main方法 fori 输出for语句 iter 输出foreach语句 Ctrl+Shift+U 大小写转换 Ctrl+Shift+Enter 补全一 ...

  10. 获取spring上下文的bean 工具类

    有些场景我们不属于controller,service,dao,但是我们需要从spring中得到spring容器里面的bean.这时候我们需要一个类继承 ApplicationContextAware ...