天天看点

处理多个网络请求的并发

今天有一个朋友问我,怎么能让多个网络请求,请求到数据后告诉想要的接口在进行接力就像如下:

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 串行队列有序请求多个接口