使用GCD-dispatch_semaphore同步下载请求

本文介绍如何利用GCD信号量控制iOS应用中多个网络请求的执行顺序,确保请求按预设顺序进行,避免并发导致的问题。

场景:

多个请求任务需要按顺序执行。

方案:

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




评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值