美文网首页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是不是和标题有关系了,可能还不是很符合。就这样了,谢谢大家。

    相关文章

      网友评论

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

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