美文网首页
GCD信号量的线程同步实际应用

GCD信号量的线程同步实际应用

作者: dalu | 来源:发表于2021-12-13 11:46 被阅读0次

我们在APP开发过程中经常会遇到 :一个 APP 页面需要同时请求多个接口都完成后再刷新界面。

GCD的队列组dispatch_group是一个常用的解决方案。
当然还有其它方案,本文不做讨论。

dispatch_group_t group = dispatch_group_create();
//创建并行队列
dispatch_queue_t conQueue = dispatch_queue_create("com.selectCorrentNetsAsys", DISPATCH_QUEUE_CONCURRENT);
dispatch_group_async(group, conQueue, ^{
    //网络A请求
});
dispatch_group_async(group, conQueue, ^{
    //网络B请求
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
    //更新UI
});

这段代码恐怕大家都看烂了,为什么还要写一篇小文呢,别急!

实际应用中出现的问题:
网络请求在App中是封装好的,都是异步请求。会出现数据请求还没有完成,迅速就执行了dispatch_group_notify更新UI了。
如何解决这种情况?(核心内容)
把异步网络请求操作改成同步请求,信号量dispatch_semaphore就是合适人选🤠。

dispatch_semaphore_t signal = dispatch_semaphore_create(0);
dispatch_group_t group = dispatch_group_create();
//创建并行队列
dispatch_queue_t conQueue = dispatch_queue_create("com.selectCorrentNetsAsys", DISPATCH_QUEUE_CONCURRENT);
dispatch_group_async(group, conQueue, ^{
    //网络A请求
    [LoginRequest doPingWithIP:@"www.baiduA.com" finishBlock:^(BOOL isok) {
        if (isok) {
            
        }
        dispatch_semaphore_signal(signal);
    }];
    dispatch_semaphore_wait(signal, DISPATCH_TIME_FOREVER);
});
dispatch_group_async(group, conQueue, ^{
    //网络B请求
    [LoginRequest doPingWithIP:@"www.baiduB.com" finishBlock:^(BOOL isok) {
        if (isok) {
            
        }
        dispatch_semaphore_signal(signal);
    }];
    dispatch_semaphore_wait(signal, DISPATCH_TIME_FOREVER);
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
    //更新UI
});

注意:有些人的网络请求是成功和失败分开的两个block,记得都要执行dispatch_semaphore_signal(signal)哦!

相关文章

  • GCD信号量的线程同步实际应用

    我们在APP开发过程中经常会遇到 :一个 APP 页面需要同时请求多个接口都完成后再刷新界面。 GCD的队列组di...

  • GCD

    异步线程GCD //信号量

  • Swift多线程:GCD进阶,单例、信号量、任务组

    Swift多线程:GCD进阶,单例、信号量、任务组 Swift多线程:GCD进阶,单例、信号量、任务组

  • iOS多线程——dispatch_semaphore

    dispatch_semaphore是GCD中的信号量,可以处理多线程中线程并发的问题,也可以用作同步处理 一、d...

  • GCD线程同步的研究

    在GCD中关于线程同步的问题,有很多中实现方式:Group函数,barrier函数,信号量等;这里只是简单研...

  • GCD常用方法

    1.创建异步线程 2.创建同步线程 3.创建主线程 4.GCD只执行一次 5.线程延迟调用 6.信号量 dispa...

  • GCD练习

    GCD练习 ios 多线程 GCD : ios 多线程 全剧队列,异步执行 线程间通信 信号量 文件锁 单利模式 ...

  • 2、ios下如何实现指定线程数目的线程池?

    ios下如何实现指定线程数目的线程池? 1、GCD的信号量机制(dispatch_semaphore) 信号量是一...

  • GCD 信号量 dispatch_semaphore

    Dispatch Semaphore信号量是一种持有计数的信号,实际开发中主要用于保持线程同步,将异步任务转为同步...

  • 信号量与互斥锁

    线程同步(互斥锁与信号量的作用与区别) “信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别...

网友评论

      本文标题:GCD信号量的线程同步实际应用

      本文链接:https://www.haomeiwen.com/subject/deejfrtx.html