今天有一個朋友問我,怎麼能讓多個網絡請求,請求到資料後告訴想要的接口在進行接力就像如下:
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 串行隊列有序請求多個接口