iOS - 网络请求并发和同步

有时我们需要将多个网络请求并行或者串行执行完后回到主线程执行某些操作,这时候我们可以借助dispatch_semaphore来实现这个功能,下面模拟三个网络请求,实际中NSUrlSession中的方法本身就是异步的,所以不用开辟异步线程。

    __block NSString *string1;
    __block NSString *string2;
    __block NSString *string3;
    
//    串行
//    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
//    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//        [NSThread sleepForTimeInterval:8];
//        string1 = @"任务1";
//        NSLog(@"任务1-start");
//        dispatch_semaphore_signal(semaphore);
//    });
//    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
//    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//        [NSThread sleepForTimeInterval:5];
//        string2 = @"任务2";
//        NSLog(@"任务2-start");
//        dispatch_semaphore_signal(semaphore);
//    });
//    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
//    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//        [NSThread sleepForTimeInterval:5];
//        string3 = @"任务3";
//        NSLog(@"任务3-start");
//        dispatch_semaphore_signal(semaphore);
//    });
//    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
//    NSLog(@"%@-%@-%@",string1,string2,string3);
    
//    并行
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        [NSThread sleepForTimeInterval:8];
        string1 = @"任务1";
        NSLog(@"任务1-start");
        dispatch_semaphore_signal(semaphore);
    });
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        [NSThread sleepForTimeInterval:5];
        string2 = @"任务2";
        NSLog(@"任务2-start");
        dispatch_semaphore_signal(semaphore);
    });
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        [NSThread sleepForTimeInterval:5];
        string3 = @"任务3";
        NSLog(@"任务3-start");
        dispatch_semaphore_signal(semaphore);
    });
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    NSLog(@"%@-%@-%@",string1,string2,string3);
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本文内容任务、队列的概念、创建方式任务 + 队列的6种组合的执行方式线程间如何通信dispatch_once、di...
    小秀秀耶阅读 1,041评论 0 9
  • Dispatch Queues dispatch queues是执行任务的强大工具,允许你同步或异步地执行任意代码...
    YangPu阅读 662评论 0 4
  • 谈到iOS多线程,一般都会谈到四种方式:pthread、NSThread、GCD和NSOperation。其中,苹...
    攻城狮GG阅读 287评论 0 3
  • 前言 该篇介绍并发,串行,并行,异步和同步详解和使用,以及其他方法,在理解多线程之前,必须先知道这几个概念。 并发...
    凉秋落尘阅读 2,002评论 1 1
  • 本文用来介绍 iOS 多线程中 GCD 的相关知识以及使用方法。这大概是史上最详细、清晰的关于 GCD 的详细讲...
    花花世界的孤独行者阅读 525评论 0 1