博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
GCD处理多线程同步操作 韩俊强的博客
阅读量:7089 次
发布时间:2019-06-28

本文共 1985 字,大约阅读时间需要 6 分钟。

原文地址: 未经许可,严禁转载!

GCD使用 dispatch_group_notifydispatch_group_enterdispatch_group_leave处理多线程同步操作

一、简介

dispatch_group_enter:通知group,下面的任务马上要放到group中执行。

dispatch_group_leave:通知group,任务完成了,该任务要从group中移除。

通常两者穿插于任务中;

二、测试

- (void)syncActionTest{    dispatch_group_t group = dispatch_group_create();    dispatch_group_enter(group);    //模拟多线程耗时操作    dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{        sleep(3);        NSLog(@"%@----Block1结束",[NSThread currentThread]);        dispatch_group_leave(group);    });    NSLog(@"%@----1结束",[NSThread currentThread]);    dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{        sleep(3);        NSLog(@"%@----Block2结束",[NSThread currentThread]);        dispatch_group_leave(group);    });    NSLog(@"%@----2结束",[NSThread currentThread]);    dispatch_group_notify(group, dispatch_get_global_queue(0, 0), ^{        dispatch_async(dispatch_get_main_queue(), ^{            NSLog(@"%@---全部结束",[NSThread currentThread]);        });    });}

三、应用

常见如 : 多图片上传, 在上传完所有图片后将imgUrl数组上传到服务器
dispatch_group_t group = dispatch_group_create();    __weak DespritionViewController *weakSelf = self;    for (UIImage *image in self.arrDataSources) {        dispatch_group_enter(group);        [ZDUserHttpRequest uploadImage:image andType:@"1" completion:^(NSString *picUrl) {            dispatch_group_leave(group);            if (picUrl) {                [weakSelf.picUrlArr addObject:picUrl];            } else {                [SVProgressHUD showErrorWithStatus:@"上传失败,请重试"];            }        } failed:^(NSURLSessionDataTask *task, NSError *error) {            dispatch_group_leave(group);        }];    }    dispatch_group_notify(group, dispatch_get_global_queue(0, 0), ^{        dispatch_async(dispatch_get_main_queue(), ^{            do something...        });    });

结论:

在开启了多线程执行任务时,若使用了dispatch_group_notifydispatch_group_enterdispatch_group_leave,也能有效的保证了等所有的子线程任务处理完后,有一个处理最后结果的地方。

iOS开发者交流群:①446310206 ②446310206
推荐资源:

你可能感兴趣的文章
在 iOS 的 SQLite 数据库中应用 FMDB 库
查看>>
可执行镜像——开发环境的Docker化之路
查看>>
使用自选择创建团队
查看>>
基于组织目标采用合适的敏捷方法
查看>>
Spark性能调优之道——解决Spark数据倾斜(Data Skew)的N种姿势
查看>>
李彦宏宣布百度架构调整:智能云事业部升级
查看>>
NetBeans第一部分代码提交Apache
查看>>
支持医学研究的Apple开源移动框架
查看>>
使用人工智能测试软件
查看>>
InfoQ趋势报告:DevOps 和云计算
查看>>
Microsoft Edge中新的F12开发者工具
查看>>
为所有PHP-FPM容器构建单独的Nginx Docker镜像
查看>>
微软宣布Azure Functions正式支持Java
查看>>
抖音成2018年全球iOS设备上下载最多的应用\n
查看>>
IBM核心软件如何应对“互联网+”的技术挑战
查看>>
Weaveworks增加发布自动化和事件管理
查看>>
LeetCode[337] House Robber III
查看>>
Weblogic 12c 使用 WLST 新建域
查看>>
快速掌握dockerfile
查看>>
Android动态设置主题(使用RxBus模式)
查看>>