使用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,解除等待,继续往下执行第二步请求。




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