場景:
多個請求任務需要按順序執行。
方案:
使用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,解除等待,繼續往下執行第二步請求。