使用GCD-dispatch_semaphore同步下載請求

場景:

多個請求任務需要按順序執行。

方案:

使用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,解除等待,繼續往下執行第二步請求。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章