iOS dispatch_semaphore_t(信号量)和 2.dispatch_group_t (组)

时间:2023-03-10 01:42:53
iOS dispatch_semaphore_t(信号量)和 2.dispatch_group_t  (组)

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私聊我即可。

传送门:点击打开链接