第25月第26天 dispatch_group_t dispatch_semaphore_t
1.
dispatch_group_enter(group);
dispatch_group_leave(group);
dispatch_group_notify(group1, queue1,block);
在这种组合下,根据任务是同步、异步又分为两种,这两种组合的执行代码与运行结果如下:
第一种:同步任务时

- dispatch_queue_t queue2 = dispatch_queue_create("dispatchGroupMethod2.queue2", DISPATCH_QUEUE_CONCURRENT);
- dispatch_group_t group2 = dispatch_group_create();
- dispatch_group_enter(group2);
- dispatch_sync(queue2, ^{
- for (NSInteger i =0; i<3; i++) {
- sleep(1);
- NSLog(@"%@-同步任务执行-:%ld",@"任务1",(long)i);
- }
- dispatch_group_leave(group2);
- });
- dispatch_group_enter(group2);
- dispatch_sync(queue2, ^{
- for (NSInteger i =0; i<3; i++) {
- sleep(1);
- NSLog(@"%@-同步任务执行-:%ld",@"任务2",(long)i);
- }
- dispatch_group_leave(group2);
- });
- // //等待上面的任务全部完成后,会往下继续执行 (会阻塞当前线程)
- // dispatch_group_wait(group2, DISPATCH_TIME_FOREVER);
- //等待上面的任务全部完成后,会收到通知执行block中的代码 (不会阻塞线程)
- dispatch_group_notify(group2, queue2, ^{
- NSLog(@"Method2-全部任务执行完成");
- });

同步任务执行结果:
第二种:异步任务时

- dispatch_queue_t queue2 = dispatch_queue_create("dispatchGroupMethod2.queue2", DISPATCH_QUEUE_CONCURRENT);
- dispatch_group_t group2 = dispatch_group_create();
- dispatch_group_enter(group2);
- dispatch_async(queue2, ^{
- for (NSInteger i =0; i<3; i++) {
- sleep(1);
- NSLog(@"%@-异步任务执行-:%ld",@"任务1",(long)i);
- }
- dispatch_group_leave(group2);
- });
- dispatch_group_enter(group2);
- dispatch_async(queue2, ^{
- for (NSInteger i =0; i<3; i++) {
- sleep(1);
- NSLog(@"%@-异步任务执行-:%ld",@"任务2",(long)i);
- }
- dispatch_group_leave(group2);
- });
- // //等待上面的任务全部完成后,会往下继续执行 (会阻塞当前线程)
- // dispatch_group_wait(group2, DISPATCH_TIME_FOREVER);
- //等待上面的任务全部完成后,会收到通知执行block中的代码 (不会阻塞线程)
- dispatch_group_notify(group2, queue2, ^{
- NSLog(@"Method2-全部任务执行完成");
- });

异步任务执行结果:
https://www.cnblogs.com/zhou--fei/p/6747938.html
2.
创建一个信号量,作为全局变量。
并初始化,信号量为0
dispatch_semaphore_t semaphore;
semaphore = dispatch_semaphore_create(0);
创建一个dispatch_group_t,开启两个组异步线程(dispatch_group_async),分别执行两个网络请求。
一个组通知线程(dispatch_group_notify),用于接收前面两个线程的结果。
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_async(group, queue, ^{
[weakSelf loadRelationDetail];//请求1
});
dispatch_group_async(group, queue, ^{
[weakSelf loadRelationReward];//请求2
});
dispatch_group_notify(group, queue, ^{
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
//合并(此处是数据处理,你可根据具体业务需求进行处理)
NSMutableArray *arr = [NSMutableArray array];
[arr addObjectsFromArray:weakSelf.arr1];
[arr addObjectsFromArray:weakSelf.arr2];
//排序
if (arr.count > 1) {
weakSelf.sumArr = [arr sortedArrayUsingComparator:^NSComparisonResult(ZHShareItem *obj1, ZHShareItem *obj2) {
return [obj1.createTime compare:obj2.createTime];
}];
}else{
weakSelf.sumArr = arr;
}
//有数据刷新
if (weakSelf.sumArr.count > 0) {
//在主线程刷新页面
dispatch_async(dispatch_get_main_queue(), ^{
[weakSelf initTableView];
});
}
});
https://www.jianshu.com/p/4e997f5deda9
3.afnetworking
为每一个NSURLSessionDownloadTask创建AFURLSessionManagerTaskDelegate,把请求的completionHandler也放在delegate。
从统一的回调didCompleteWithError到delegate的didCompleteWithError,再调用completionHandler返回。
- - (void)addDelegateForDownloadTask:(NSURLSessionDownloadTask *)downloadTask
- progress:(void (^)(NSProgress *downloadProgress)) downloadProgressBlock
- destination:(NSURL * (^)(NSURL *targetPath, NSURLResponse *response))destination
- completionHandler:(void (^)(NSURLResponse *response, NSURL *filePath, NSError *error))completionHandler
- {
- AFURLSessionManagerTaskDelegate *delegate = [[AFURLSessionManagerTaskDelegate alloc] init];
- delegate.manager = self;
- delegate.completionHandler = completionHandler;
- if (destination) {
- delegate.downloadTaskDidFinishDownloading = ^NSURL * (NSURLSession * __unused session, NSURLSessionDownloadTask *task, NSURL *location) {
- return destination(location, task.response);
- };
- }
- downloadTask.taskDescription = self.taskDescriptionForSessionTasks;
- [self setDelegate:delegate forTask:downloadTask];
- delegate.downloadProgressBlock = downloadProgressBlock;
- }
response
- - (void)URLSession:(NSURLSession *)session
- task:(NSURLSessionTask *)task
- didCompleteWithError:(NSError *)error
- {
- AFURLSessionManagerTaskDelegate *delegate = [self delegateForTask:task];
- // delegate may be nil when completing a task in the background
- if (delegate) {
- [delegate URLSession:session task:task didCompleteWithError:error];
- ...
- //需要加锁
- - (AFURLSessionManagerTaskDelegate *)delegateForTask:(NSURLSessionTask *)task {
- NSParameterAssert(task);
- AFURLSessionManagerTaskDelegate *delegate = nil;
- [self.lock lock];
- delegate = self.mutableTaskDelegatesKeyedByTaskIdentifier[@(task.taskIdentifier)];
- [self.lock unlock];
- return delegate;
- }
- ...
- //每一个delegate
- #pragma mark - NSURLSessionTaskDelegate
- - (void)URLSession:(__unused NSURLSession *)session
- task:(NSURLSessionTask *)task
- didCompleteWithError:(NSError *)error
- {
- #pragma clang diagnostic push
- #pragma clang diagnostic ignored "-Wgnu"
- __strong AFURLSessionManager *manager = self.manager;
- __block id responseObject = nil;
- __block NSMutableDictionary *userInfo = [NSMutableDictionary dictionary];
- userInfo[AFNetworkingTaskDidCompleteResponseSerializerKey] = manager.responseSerializer;
- //Performance Improvement from #2672
- NSData *data = nil;
- if (self.mutableData) {
- data = [self.mutableData copy];
- //We no longer need the reference, so nil it out to gain back some memory.
- self.mutableData = nil;
- }
- if (self.downloadFileURL) {
- userInfo[AFNetworkingTaskDidCompleteAssetPathKey] = self.downloadFileURL;
- } else if (data) {
- userInfo[AFNetworkingTaskDidCompleteResponseDataKey] = data;
- }
- if (error) {
- userInfo[AFNetworkingTaskDidCompleteErrorKey] = error;
- dispatch_group_async(manager.completionGroup ?: url_session_manager_completion_group(), manager.completionQueue ?: dispatch_get_main_queue(), ^{
- if (self.completionHandler) {
- self.completionHandler(task.response, responseObject, error);
- }
- dispatch_async(dispatch_get_main_queue(), ^{
- [[NSNotificationCenter defaultCenter] postNotificationName:AFNetworkingTaskDidCompleteNotification object:task userInfo:userInfo];
- });
- });
- } else {
- dispatch_async(url_session_manager_processing_queue(), ^{
- NSError *serializationError = nil;
- responseObject = [manager.responseSerializer responseObjectForResponse:task.response data:data error:&serializationError];
- if (self.downloadFileURL) {
- responseObject = self.downloadFileURL;
- }
- if (responseObject) {
- userInfo[AFNetworkingTaskDidCompleteSerializedResponseKey] = responseObject;
- }
- if (serializationError) {
- userInfo[AFNetworkingTaskDidCompleteErrorKey] = serializationError;
- }
- dispatch_group_async(manager.completionGroup ?: url_session_manager_completion_group(), manager.completionQueue ?: dispatch_get_main_queue(), ^{
- if (self.completionHandler) {
- self.completionHandler(task.response, responseObject, serializationError);
- }
- dispatch_async(dispatch_get_main_queue(), ^{
- [[NSNotificationCenter defaultCenter] postNotificationName:AFNetworkingTaskDidCompleteNotification object:task userInfo:userInfo];
- });
- });
- });
- }
- #pragma clang diagnostic pop
- }
第25月第26天 dispatch_group_t dispatch_semaphore_t的更多相关文章
- 25. TABLESPACES , 26. TABLE_CONSTRAINTS , 27. TABLE_PRIVILEGES
25. TABLESPACES TABLESPACES表提供有关活动MySQL Cluster表空间的信息. TABLESPACES表有以下列: TABLESPACE_NAME :表空间名称 ENGI ...
- 第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 ...
- 第25月25日 urlsession
1. private lazy var session: URLSession = { let configuration = URLSessionConfiguration.default conf ...
- 第25月第22日 django channels
1. https://github.com/andrewgodwin/channels-examples/ https://channels.readthedocs.io/en/latest/
- 第25月第18天 vue
1.cnpm sudo chown -R $USER /usr/local npm install -g cnpm --registry=https://registry.npm.taobao.or ...
- 第25月第17天 django rest framwork authentication /tmp/mysql.sock
1.authentication https://www.django-rest-framework.org/api-guide/authentication/#authentication 2.dj ...
- 第25月第15天 udacity cs253
1.cs253 https://classroom.udacity.com/courses/cs253 webapp2 Install WebOb, Paste and webapp2¶ We nee ...
- 第25月第11天 deeplearning.ai
1.网易云课堂 深度学习工程师 点击进入课程地址(英文)(收费) 点击进入课程地址(中文)(免费) 第一门 神经网络和深度学习 第二门 改善神经网络 第三门 结构化机器学习项目 第四门 卷积神经网络 ...
- 第25月第9天 tf_tang_poems kaggle
1.neural-style https://github.com/anishathalye/neural-style wget http://www.vlfeat.org/matconvnet/mo ...
随机推荐
- [ZJOI2018]历史
[ZJOI2018]历史 最大化access轻重链的切换次数 考虑一个点的贡献,即它交换重儿子的次数 发现这个次数只和它自己ai以及每个儿子的子树次数和有关. 一个关键的事实是: 我们可以自上而下进行 ...
- 【NOIP数论内容整理】
转载{大佬传送门} 附赠wakelin一句评论:日均二百七,全场rank1:千古神犇ZAY,吊打清华钟皓曦%%%
- 【洛谷P1164 小A点菜】
题目背景 uim神犇拿到了uoi的ra(镭牌)后,立刻拉着基友小A到了一家……餐馆,很低端的那种. uim指着墙上的价目表(太低级了没有菜单),说:“随便点”. 题目描述 不过uim由于买了一些辅(e ...
- django引入模板时,部分css文件渲染不成功失灵引入不成功
今天碰到了一件怪事,下载好的模板,在webstorm中就好好地,但是一引入到pycharm的django项目中就各种失灵,位置错乱. 检查一番,发现该设置的都设置对了啊,而且js文件和css文件还有一 ...
- spring cron表达式(定时器)
转: spring cron表达式(定时器) 写定时器时用到,记录一下: Cron表达式是一个字符串,字符串以5或6个空格隔开,分开工6或7个域,每一个域代表一个含义,Cron有如下两种语法 格式: ...
- 网速测试脚本speedtest_cli的安装与使用
speedtest_cli的安装与使用 1.下载 wget https://raw.github.com/sivel/speedtest-cli/master/speedtest.py 图 1 2.授 ...
- 16.Linux-LCD驱动(详解)
在上一节LCD层次分析中,得出写个LCD驱动入口函数,需要以下4步: 1) 分配一个fb_info结构体: framebuffer_alloc(); 2) 设置fb_info 3) 设置硬件相关的操作 ...
- Hbase学习03
第3章 Hbase数据存储模型与工作组件 Data格式设计的的总体原则是按照需求要求,依据Hbase性能的相关标准规范和文件,并遵循“统一规范.统一数据模型.统一规划集群.分步实施”的原则,注重实际应 ...
- Idea中的一些快捷键
最常用快捷键 sout 输出语句 psvm 输出main方法 fori 输出for语句 iter 输出foreach语句 Ctrl+Shift+U 大小写转换 Ctrl+Shift+Enter 补全一 ...
- 获取spring上下文的bean 工具类
有些场景我们不属于controller,service,dao,但是我们需要从spring中得到spring容器里面的bean.这时候我们需要一个类继承 ApplicationContextAware ...