场景:
多个请求任务需要按顺序执行。
方案:
使用GCD信号量值来控制线程等待(锁)
定义:
1.dispatch_semaphore_create(信号量的值) //创建信号量,手动设置为0,模仿线程锁住
1.dispatch_semaphore_wait(信号量, 等待时间) //当信号量为0的时候,就会一直处于等待状态
1.dispatch_semaphore_signal(信号量) //发送信号量,值自动+1
使用:
使用GCD 信号量控制前-----
1.模拟设置两个请求,第一个请求时间比第二个长,但是需要先执行第一个请求
// 第一步请求
- (void)firstRequest{
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"请求第一步");
});
}
// 第二步请求
- (void)secondRequest{
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"请求第二步");
});
}
2.异步线程请求
- (void)requestAction:(UIButton *)btn{
NSLog(@"开始请求-----------");
dispatch_queue_t queque = dispatch_queue_create("miximixi", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queque, ^{
[self firstRequest];
[self secondRequest];
});
NSLog(@"回到主线程");
}
3.打印结果第二步在前,不符合要求
使用GCD 信号量控制后-----
1.在异步请求之前设置信号量为0,然后再第一步请求之后让线程一直等待
- (void)requestAction:(UIButton *)btn{
NSLog(@"开始请求-----------");
dispatch_queue_t queque = dispatch_queue_create("miximixi", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queque, ^{
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
[self firstRequestWithSemaphore:semaphore];
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
[self secondRequest];
});
NSLog(@"回到主线程");
}
2.然后第一步请求结束之后,再发送信号量,解除等待
// 第一步请求
- (void)firstRequestWithSemaphore:(dispatch_semaphore_t)semaphore{
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"请求第一步");
dispatch_semaphore_signal(semaphore);
});
}
3.打印结果永远是第一步先请求
小结:
在第一步请求之前需要先设置信号量为0;
第二步请求之前设置等待(时间设置为永久等待,相当于上锁,线程到这里就无法执行);
等到第一步请求完成后,发送信号量,值自动+1,解除等待,继续往下执行第二步请求。