在开发时有这样一个需求,有a,b,c3个网络请求,,在a请求完成后,b发起请求,b完成后c发起请求,在c结束时获得一个通知。这相当于多线程同步以及依赖,我采用dispatch_group和信号量去处理。
测试代码
//创建串行队列
dispatch_queue_t customQuue = dispatch_queue_create("com.wumeng.network", DISPATCH_QUEUE_SERIAL);
//创建信号量并初始化总量为1
semaphoreLock = dispatch_semaphore_create(0);
//添加任务
dispatch_async(customQuue, ^{
//发送第一个请求
[PPNetworkHelper POST:kUrl1 parameters:nil success:^(id responseObject) {
NSLog(@"第一个请求完成");
//dispatch_semaphore_signal发送一个信号,让信号总量加1,相当于解锁
dispatch_semaphore_signal(semaphoreLock);
} failure:^(NSError *error) {
dispatch_semaphore_signal(semaphoreLock);
}];
// 相当于加锁
dispatch_semaphore_wait(semaphoreLock, DISPATCH_TIME_FOREVER);
//发送第二个请求
[PPNetworkHelper POST:kUrl2 parameters:nil success:^(id responseObject) {
NSLog(@"第二个请求完成");
//dispatch_semaphore_signal发送一个信号,让信号总量加1,相当于解锁
dispatch_semaphore_signal(semaphoreLock);
} failure:^(NSError *error) {
dispatch_semaphore_signal(semaphoreLock);
}];
dispatch_semaphore_wait(semaphoreLock, DISPATCH_TIME_FOREVER);
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"任务完成");
});
});
通过运行结果可看出,因为是在串行队列里,每个任务会按顺序执行,在执行到第一个请求后会继续执行dispatch_semaphore_wait方法,此时semaphore=0,此线程进入等待状态,此时请求内部的异步回调会执行,执行到dispatch_semaphore_signal方法后semaphore=1,此线程恢复继续执行,这样就能实现多个有依赖的网络请求的顺序执行。