美文网首页iOS知识库
iOS信号量处理异步请求中的同步处理

iOS信号量处理异步请求中的同步处理

作者: 程序员不务正业 | 来源:发表于2017-12-07 14:36 被阅读578次
 // 创建信号量
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
    // 创建全局并行
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_group_t group = dispatch_group_create();
    dispatch_group_async(group, queue, ^{

        // 请求一
        [loginCode getUserInfoWithNick:nil andUserId:kUserId onSuc:^(id data) {
            NSLog(@"yue");
            dispatch_semaphore_signal(semaphore);

        } andFail:^(NSError *error) {       
        }];

    });
    dispatch_group_async(group, queue, ^{

        // 请求二
        [CommodityViewModel getPriceTransformForIntegral:nil onSuccess:^(id data) {

            NSLog(@"duihuan11");
            dispatch_semaphore_signal(semaphore);

        } onFailure:^(NSError *error) {
        }];
    });
    dispatch_group_async(group, queue, ^{

        // 请求三
        [CommodityViewModel getPriceTransformForIntegral:nil onSuccess:^(id data) {
            NSLog(@"duihuan22");
            dispatch_semaphore_signal(semaphore);

        } onFailure:^(NSError *error) {            
        }];
    });

    dispatch_group_notify(group, queue, ^{

        // 三个请求对应三次信号等待
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

        //在这里 进行请求后的方法,回到主线程
        dispatch_async(dispatch_get_main_queue(), ^{

            //更新UI操作

        });
    });

2018/05/27上方dispatch_semaphore和dispatch_group其实是重复了的。使用dispatch_semaphore或者dispatch_group其中一个就够了

dispatch_group使用

dispatch_group_t group = dispatch_group_create();
    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        //请求1
        NSLog(@"第一个请求");
    });
    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        //请求2
        NSLog(@"第二个请求");
    });
    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        //请求3
        NSLog(@"第三个请求");
    });
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        //界面刷新
        NSLog(@"回到主线程刷新页面");
    });

dispatch_semaphore使用

// 设定信号值=2 一次执行两个等待,必须得等两个等待结束后再次进入第三个等待
 dispatch_semaphore_t semaphore = dispatch_semaphore_create(2);
    dispatch_queue_t quene = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    
    // 任务一
    dispatch_async(quene, ^{
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        NSLog(@"111");
        sleep(1);
        NSLog(@"complete task 1");
        dispatch_semaphore_signal(semaphore);
    });
    
    // 任务二
    dispatch_async(quene, ^{
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        NSLog(@"222");
        sleep(1);
        NSLog(@"complete task 2");
        dispatch_semaphore_signal(semaphore);
    });
    
    // 任务三
    dispatch_async(quene, ^{
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        NSLog(@"3333");
        sleep(1);
        NSLog(@"complete task 3");
        dispatch_semaphore_signal(semaphore);
    });

dispatch_barrier_async使用

 dispatch_queue_t queue = dispatch_queue_create("threadgcd", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(queue, ^{
        NSLog(@"111");
    });
    
    dispatch_async(queue, ^{
        NSLog(@"222");
    });
    dispatch_async(queue, ^{
        NSLog(@"333");
    });
    
    dispatch_barrier_async(queue, ^{
        for (int i = 0; i < 5000000; i++) {
            if (50000 == i) {
                NSLog(@"point");
                sleep(5);
            }
        }
    });
    
    dispatch_async(queue, ^{
        NSLog(@"444");
    });

相关文章

  • iOS信号量处理异步请求中的同步处理

    2018/05/27上方dispatch_semaphore和dispatch_group其实是重复了的。使用di...

  • iOS信号量-处理异步请求中的同步处理

    // 创建信号量--执行3个异步网络请求

  • 异步

    异步 异步请求 同步请求:同一个请求由一个线程从头到尾进行处理 一步到位 异步请求:同一个请求中由多个线程进行处理...

  • OkHttp源码解析 -- 同步异步处理

    前言: 使用OkHttp,执行网络请求时会有异步还是同步处理。先说下异步和同步的区别,同步并不是指在UI线程中执行...

  • 前端面试题:同步和异步的区别?

    理解a: 举个例子:普通B/S模式(同步)AJAX技术(异步) 同步:提交请求 >> 等待服务器处理 >> 处理完...

  • 同步或异步异常处理

    同步或异步异常处理 同步读取异常处理 异步读取文件异常处理

  • BIO,NIO,AIO

    同步、异步、阻塞、非阻塞 同步与异步 同步: 同步就是发起一个调用后,被调用者未处理完请求之前,调用不返回。 异步...

  • Reactor模式理解(二)

    Java I/O模型 同步 vs. 异步 同步I/O每个请求必须逐个地被处理,一个请求的处理会导致整个流程的暂时等...

  • 分布式之异步处理

    同步和异步处理 处理一般可以分为同步和异步两种。同步的处理就像我们生活中打电话,打电话的双方都需要做即时的响应处理...

  • 异步Servlet 特性

    异步Servlet 本篇主要讲解 如何使用 异步Servlet的处理请求,并且演示 同步Servlet和异步Ser...

网友评论

    本文标题:iOS信号量处理异步请求中的同步处理

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