美文网首页
IOS 网络并发请求

IOS 网络并发请求

作者: 叩首问路梦码为生 | 来源:发表于2017-12-04 08:42 被阅读0次

现在有一个需求:某个页面中的数据是通过三个接口给出的,现在需要三个接口中的数据全部返回后再一起展示全部数据。
需求分析:1.我们要将三个网络请求放在新开辟的子线程。 2.为了提高效率要将三个网络请求采用异步请求的方式。 3.要确保三个网络请求结束以后再进行展示数据的操作。
当遇到这样的需求的时候我们可以利用GCD中的组(group)来实现。我们将每个线程操作放到组中,在所有的线程操作完成之后回到主线程中进行UI页面的刷新。代码:

// 全局变量group
    dispatch_group_t group =dispatch_group_create();
    // 并行队列
    dispatch_queue_t queue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
    
    // 进入组(进入组和离开组必须成对出现,否则会造成死锁)
    dispatch_group_enter(group);
    dispatch_group_async(group, queue, ^{
        // 执行异步任务1
        [NSThreadsleepForTimeInterval:2];
        for (int i =0; i < 3; i ++) {
            NSLog(@"%d---%@", i, [NSThreadcurrentThread ]);    //子线程
        }
        _str1 =@"str1";
 dispatch_group_leave(group);
    });
   
    
    // 进入组
    dispatch_group_enter(group);
    dispatch_group_async(group, queue, ^{
        // 执行异步任务2
        [NSThreadsleepForTimeInterval:2];
        for (int i =3; i < 6; i ++) {
            NSLog(@"%d---%@", i, [NSThreadcurrentThread ]);
        }
        _str2 =@"str2";
        dispatch_group_leave(group);
    });
    
    
    dispatch_group_notify(group,dispatch_get_main_queue(), ^{
        NSLog(@"%@",_str1);
        NSLog(@"%@",_str2);
        NSLog(@"%@", [NSThreadcurrentThread]); //主线程
        NSLog(@"完成...");
    });

注意:代码中使用了dispatch_group_enter(group)和 dispatch_group_leave(group)是为了确保每个任务的完成,即使某个任务是异步的,在所有任务都完成后再执行notify中的代码。

方式二 :用 信号量检测

 // 创建信号量
    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操作

        });


    });

相关 文档 :http://blog.csdn.net/a454431208/article/details/77070778
http://blog.csdn.net/cloudox_/article/details/71107179

相关文章

  • IOS 网络并发请求

    现在有一个需求:某个页面中的数据是通过三个接口给出的,现在需要三个接口中的数据全部返回后再一起展示全部数据。需求分...

  • iOS 【GCD实战之多个网络请求的并发】

    摘录:iOS开发网络篇:GCD实战之多个网络请求的并发 第二种 通过请求数量计数 dispatch_group +...

  • iOS多个网络请求并发

    笔者前不久终于发布了自己的APP《印记(官方版)》,希望读者能前往App Store下载《印记(官方版)》支持一下...

  • 多线程GCD

    无序网络请求,异步+并发 有序网络请求,异步+并发(推荐) dispatch_semaphore_create:创...

  • GCD 的使用一些常用方法

    可以参考类似文章:iOS使用dispatch_group实现分组并发网络请求 GCD是iOS中的一种多线程技术,全...

  • iOS网络请求相关框架的使用

    iOS网络请求相关框架的使用 iOS网络请求相关框架的使用

  • iOS 异步并发多个网络请求

    在讲解域名切花之前,先说一下废话吧,域名切换名字很自然就是基础域名的切换,很多时候因为单个服务压力过大时,会在造成...

  • iOS分组并发网络请求

    需求1:有多个网络请求,要求所有网络请求全部完成后,进行页面刷新等操作需求2:有多个网络请求,且要求网络请求顺序依...

  • iOS - 网络请求并发和同步

    有时我们需要将多个网络请求并行或者串行执行完后回到主线程执行某些操作,这时候我们可以借助dispatch_sema...

  • iOS开发·网络请求方法总结复习(下)

    iOS开发·网络请求方法总结复习(下) iOS开发·网络请求方法总结复习(下)

网友评论

      本文标题:IOS 网络并发请求

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