美文网首页iOS学习
线程里异步线程的执行顺序问题

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

作者: buzaixian程序员 | 来源:发表于2016-12-20 16:10 被阅读19次

看到标题也许会懵逼,我也为了起这个标题懵逼了半天。举个例子,现在要等到两个网络请求都结束之后才做接下来的操作。有人会说这和标题有毛线关系啊,那就往下看吧。解决这个问题的关键是知道两个网络请求什么时候结束就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是不是和标题有关系了,可能还不是很符合。就这样了,谢谢大家。

相关文章

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

    看到标题也许会懵逼,我也为了起这个标题懵逼了半天。举个例子,现在要等到两个网络请求都结束之后才做接下来的操作。有人...

  • 一、多线程基础

    多线程基础 基本概念 同步、异步 同步 线程B要等待线程A的执行结果之后才能执行。要顺序执行 异步 相对同步来说,...

  • iOS多线程-并发队列

    GCD 并发队列 并发队列,异步执行 问题:1.会开几条线程?会开多条线程,线程数量是由GCD来决定2.会顺序执行...

  • 1-5linux系统编程——线程并发

    线程并发要求 线程并发性 同步:进程/线程中的部分指令需要按照一定的顺序前后执行异步:进程/线程之前的指令执行顺序...

  • 无标题文章

    同步任务: 优先级高,在线程中有执行顺序,不会开启新的线程 异步任务: 优先级低,在线程中执行没有顺序,看cpu闲...

  • iOS 多线程-CGD

    串行队列同步执行,不开启新线程,任务按顺序执行 串行队列异步执行,会开启新线程(1个),任务按照顺序执行 并行队列...

  • Javascript 事件循环eventLoop

    都知道javascript是单线程,那么问题来了,既然是单线程顺序执行,那怎么做到异步的? 我们理解的单线程应该是...

  • iOS GCD 常用功能

    获取主队列 异步执行 会开新线程 创建串行队列 开一个线程 顺序执行 1 和 2 创建并行队列 创建多个线程 ...

  • 多线程、单线程与同步、异步

    同步与异步多用于函数调用. 同步即是你调用主线程去执行函数,且有顺序的执行,所谓的自始自终.而异步的其实也是单线程...

  • Swift GCD 的串行队列与并行队列

    队列异步是否阻塞当前线程同步是否阻塞当前线程执行顺序串行队列否是按添加顺序并行队列否是同时执行,但会被同步阻塞 串...

网友评论

    本文标题:线程里异步线程的执行顺序问题

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