天天看點

處理多個網絡請求的并發

今天有一個朋友問我,怎麼能讓多個網絡請求,請求到資料後告訴想要的接口在進行接力就像如下:

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 串行隊列有序請求多個接口