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

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

你可能感兴趣的:(线程里异步线程的执行顺序问题)