今天有一个朋友问我,怎么能让多个网络请求,请求到数据后告诉想要的接口在进行接力就像如下:
1、先登陆 获取信息一id
2、通过信息一的id获取信息二id
3、通过信息二的id获取信息三msg
说出你有的方案,三个请求都是异步返回的
解析:其实这个问题的重点就是把异步变成同步,有序的进行操作。
有两种解析操作方式:
1、我当时首先想到的就是NSOperationQueue的队列,在让队列线程加上依赖关系。
2、通过GCD信号量,先创建信号量,使用队列异步执行,执行成功后在执行后面的数据。
3、通过GCD串行队列,也可以实现顺序请求接口
1、使用NSOperationQueue队列加上依赖关系
// 创建一个队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
// 设置最大线程数
queue.maxConcurrentOperationCount = 5;
NSBlockOperation *operationA = [NSBlockOperation blockOperationWithBlock:^{
for (int i = 1; i < 5; i++) {
NSLog(@"i 的值是:%d",i);
}
}];
NSBlockOperation *operationB = [NSBlockOperation blockOperationWithBlock:^{
for (int i = 1; i < 5; i++) {
NSLog(@"j 的值是:%d",i);
}
}];
// 添加依赖, b要在a打印完在进行打印,所以是b依赖于a
[operationB addDependency:operationA];
// 分别加入队列中
[queue addOperation:operationA];
[queue addOperation:operationB];
队列加依赖关系效果图
2、使用GCD使用信号量
// 信号量
- (void)semaphore{
@autoreleasepool {
// 创建信号量
__block dispatch_semaphore_t sem = dispatch_semaphore_create(0);
// 创建队列
dispatch_queue_t queue = dispatch_queue_create("testBlock", NULL);
dispatch_async(queue, ^{
for (int i = 1; i <= 5; i++) {
NSLog(@"i 的值是:%d",i);
}
// 发送通知
dispatch_semaphore_signal(sem);
});
// 信号量等待
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
for (int j = 1; j <= 5; j++) {
NSLog(@"j 的值是:%d",j);
}
}
}
信号量效果图
3、GCD使用串行队列
// 创建串行队列
dispatch_queue_t serialQueue = dispatch_queue_create("fkjava.queue", DISPATCH_QUEUE_SERIAL);
/// 串行
- (IBAction)serialAction:(id)sender {
dispatch_async(serialQueue, ^{
for (int i = 0; i < 10; i++) {
NSLog(@"serial==%@==11111==>%d",[NSThread currentThread],i);
}
});
dispatch_async(serialQueue, ^{
for (int j = 0; j < 10; j++) {
NSLog(@"serial==%@====22222===>%d",[NSThread currentThread],j);
}
});
}
GCD 串行队列有序请求多个接口