美文网首页
iOS 如何判断多个异步线程是否执行完毕

iOS 如何判断多个异步线程是否执行完毕

作者: eden_lx | 来源:发表于2020-04-11 20:49 被阅读0次

前言

在实际开发中有A、B、C、D异步请求,需要A、B、C、D执行完,然后去执行其他线程。有什么办法可以处理?

方法一:RunLoop

NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.baidu.com"]] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {

NSLog(@"A");

CFRunLoopStop(CFRunLoopGetMain());

}] ;

[task resume];

CFRunLoopRun();

NSLog(@"B");

这里执行结果是先输出A后在输出B,注意CFRunLoopRun()的位置

方法二:GCD的group

原理就是利用dispatch_group_async执行完queue会执行dispatch_group_notify回调

多线程操作时这个方法使用频繁

dispatch_group_t group = dispatch_group_create();

dispatch_queue_t queue = dispatch_get_global_queue(0, 0);

dispatch_group_async(group, queue, ^{

    NSLog(@"A");

});

dispatch_group_notify(group, dispatch_get_main_queue(), ^{

    NSLog(@"B");

});

输出A后再输出B

方法三:dispatch_barrier_async

一般使用dispatch_barrier_async, 会让barrier之前的线程执行完成之后才会执行barrier后面的操作,起到一个阻挡的作用。

dispatch_queue_t queue =  dispatch_queue_create(0, DISPATCH_QUEUE_CONCURRENT);

dispatch_async(queue, ^{

    NSLog(@"A");

});

dispatch_async(queue, ^{

    NSLog(@"C");

});

dispatch_barrier_async(queue, ^{

    NSLog(@"拿到了A的值");

});

dispatch_async(queue, ^{

    NSLog(@"D");

});

dispatch_async(queue, ^{

    NSLog(@"E");

});dispatch_async(queue, ^{

    NSLog(@"F");

});

A、C输出顺序不固定,然后输出拿到了A的值,然后D、E、F输出顺序不固定

这里指定的并发队列是自己通过dispatch_queue_create函数创建的,如果你传的是一个串行队列或者全局并发队列,这个函数等同于dispatch_async函数

方法四:NSOperationQueue

主要就是用到NSOperationQueue的一个对象方法addDependency :

需要注意一点:waitUntilFinished如果是YES,必须等到queue中所有Operation执行完毕之后, 才会打D, 起到一个阻塞的作用,反之的话, D的打印顺序是随机的了,就看哪个线程跑得快了…

NSOperationQueue *queue = [[NSOperationQueue alloc] init];

NSBlockOperation *p1 = [NSBlockOperation blockOperationWithBlock:^{

    NSLog(@"A");

}];

NSBlockOperation *p2 = [NSBlockOperation blockOperationWithBlock:^{

    NSLog(@"B");

}];

NSBlockOperation *p3 = [NSBlockOperation blockOperationWithBlock:^{

    NSLog(@"C");

}];

[p3 addDependency:p1];

[p1 addDependency:p2];

// waitUntilFinished是否阻塞当前线程

[queue addOperations:@[p1,p2,p3] waitUntilFinished:YES];

// 如果是NO,那么这行打印就是随机的, 反之就是等A,B,C都打印完之后才执行

NSLog(@”D”);

输出C、A、B再输出D

相关文章

  • 多线程相关

    iOS如何判断多个异步线程是否执行完毕[https://www.jianshu.com/p/ef8b243c4f6...

  • iOS如何判断多个异步线程是否执行完毕

    前言 在实际开发中有A、B、C、D异步请求,需要A、B、C、D执行完,然后去执行其他线程。有什么办法可以处理? 方...

  • iOS 如何判断多个异步线程是否执行完毕

    前言 在实际开发中有A、B、C、D异步请求,需要A、B、C、D执行完,然后去执行其他线程。有什么办法可以处理? 方...

  • 线程池判断是否执行完毕

    方法一、使用shutdown方法,该方法会让线程池不在继续接收新的线程,直到没有线程后通过循环判断是否所有线程都执...

  • iOS 多线程基础

    转自:iOS 多线程基础 - 简书 多线程同步和异步的区别?IOS中如何实现多线程的同步? 异步:可以同时执行多条...

  • 常用gcd-dispatch_async

    线程异步处理后,主线程再处理 延时处理 判断三个并发队列执行完毕的方法dispatch_group_notify ...

  • iOS • 记——多线程必知必会的原理概念

    多线程概念 同步 && 异步 同步:一个人依次执行多个任务异步:多个人同时执行多个任务 进程 && 线程 进程:1...

  • 同步、异步与串行、并发

    1、同步、异步描述的是当前线程或代码流是否要阻塞以等待加入队列的任务执行完毕;同步要阻塞当前线程,异步不会阻塞当前...

  • 题目

    js: setTimeout时间延迟为何不准?单线程,先执行同步主线程,再执行异步任务队列。 如何判断变量的类型?...

  • GCD初理解

    队列可以同步执行也可以异步执行。是否会开启子线程只与是否创建异步执行有关。

网友评论

      本文标题:iOS 如何判断多个异步线程是否执行完毕

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