线程里异步线程的执行顺序问题

看到标题也许会懵逼,我也为了起这个标题懵逼了半天。举个例子,现在要等到两个网络请求都结束之后才做接下来的操作。有人会说这和标题有毛线关系啊,那就往下看吧。解决这个问题的关键是知道两个网络请求什么时候结束就ok了。

方法1:设两个BOOL值在网络请求结束的时候设为YES就ok了。

    //设个线程模仿网络请求
    dispatch_async(dispatch_get_main_queue(), ^{
        //休眠(模仿网络请求所需要的时间)
        sleep(2);
        self.request1 = YES;
        [self requestFinish];
    });
    dispatch_async(dispatch_get_main_queue(), ^{
        //休眠(模仿网络请求所需要的时间)
        sleep(3);
        self.request2 = YES;
        [self requestFinish];
    });

   -(void)requestFinish
  {
    if (self.request1 && self.request2) {
        //将request1和request2设为NO,可能会遇到重复加载
        self.request2 = NO;
        self.request1 = NO;
        NSLog(@"requestFinish");
    }
  }

方法2:这个方法就和标题有关了,先粘为进

    // 如果必须在并行队列中异步执行任务,比如说获取到两个请求后的数据再进行下一步的操作,这时可以用dispatch_group_enter和dispatch_group_leave,这两个必须成对出现,有一个enter就要有一个leave,否则会造成死锁,dispatch_group_notify不会被调用,还会崩溃的
    // 全局并行队列
    dispatch_queue_t globalQueue = dispatch_get_global_queue(0, 0);
    // 创建一个group
    dispatch_group_t group = dispatch_group_create();
    dispatch_group_enter(group);
    dispatch_group_async(group, globalQueue, ^{
        // 网络请求线程
        dispatch_async(globalQueue, ^{
            sleep(4);
            NSLog(@"group-01 - %@", [NSThread currentThread]);
            dispatch_group_leave(group);
        });
    });
    dispatch_group_enter(group);
    dispatch_group_async(group, globalQueue, ^{
        // 网络请求线程
        dispatch_async(globalQueue, ^{
            sleep(1);
            NSLog(@"group-02 - %@", [NSThread currentThread]);
            dispatch_group_leave(group);
        });
    });
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        NSLog(@"完成 - %@", [NSThread currentThread]);
    });

这个方法是通过并行队列和group来实现的,dispatch_group_enterdispatch_group_leave保证了网络请求结束了才执行dispatch_group_notify,现在想想方法2是不是和标题有关系了,可能还不是很符合。就这样了,谢谢大家。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • __block和__weak修饰符的区别其实是挺明显的:1.__block不管是ARC还是MRC模式下都可以使用,...
    LZM轮回阅读 3,374评论 0 6
  • 同步/异步 同步:多个任务情况下,一个任务A执行结束,才可以执行另一个任务B。只存在一个线程也就是主线程。 异步:...
    XLsn0w阅读 309评论 0 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,981评论 19 139
  • 闭上眼好吗? 轻轻地 别再让睫毛颤动 听啊!滴答滴答 小石板上 一滴雨“答”地一声落在地上 又随着小伙伴们跑到沟渠...
    花不朵阅读 182评论 0 0
  • 早起 28 Day 阅读 3 本: 《富爸爸穷爸爸》电子书、《奇特的一生》电子书、重读《哪有没时间这回事》实体书 ...
    瑞吉记录时间阅读 223评论 0 0