iOS - GCD队列、任务组合

简介: iOS - GCD队列、任务组合

1.  单个队列


dispatch_queue_t serialQueue = dispatch_queue_create("serial", DISPATCH_QUEUE_SERIAL);
    dispatch_queue_t concurrentQueue = dispatch_queue_create("concur", DISPATCH_QUEUE_CONCURRENT);
    dispatch_queue_t mainQueue = dispatch_get_main_queue();
    NSLog(@"--主队列 %@", [NSThread currentThread]);
    //1. 同步串行(不会开启新线程)
    dispatch_sync(serialQueue, ^{
        NSLog(@"--同步串行 %@", [NSThread currentThread]);
    });
    //2. 同步并行(不会开启新线程)
    dispatch_sync(concurrentQueue, ^{
        NSLog(@"--同步并行: %@", [NSThread currentThread]);
    });
    //3. 异步串行(会开启新线程)
    dispatch_async(serialQueue, ^{
        NSLog(@"--异步串行: %@", [NSThread currentThread]);
    });
    //4. 异步并行(会开启新线程)
    dispatch_async(concurrentQueue, ^{
        NSLog(@"--异步并行: %@", [NSThread currentThread]);
    });
    //5. 异步主队列(没有开启新线程)
    dispatch_async(mainQueue, ^{
        NSLog(@"--异步主队列: %@", [NSThread currentThread]);
    });
    //6. 主线程同步(死锁)
    dispatch_sync(mainQueue, ^{
        NSLog(@"--主线程同步: %@", [NSThread  currentThread]);
    });


2. 队列嵌套


NSLog(@"--主线程: %@", [NSThread currentThread]);
    dispatch_queue_t serialQueue = dispatch_queue_create("com.objcc.serial1", DISPATCH_QUEUE_SERIAL);
    dispatch_queue_t concurrentQueue = dispatch_queue_create("com.objcc.concurrent1", DISPATCH_QUEUE_CONCURRENT);
    //1. 异步并发嵌套同一个同步并发(异步并发创建新线程,同步并发没有创建新线程)
    dispatch_async(concurrentQueue, ^{
        NSLog(@"--异步并发: %@", [NSThread currentThread]);
        dispatch_sync(concurrentQueue, ^{
            NSLog(@"--同步并发: %@", [NSThread currentThread]);
        });
    });
    //2. 异步并发嵌套同同一个异步并发队列(外层创建新线程,内层不创建新线程)
    dispatch_async(concurrentQueue, ^{
        NSLog(@"--异步并发1: %@",[NSThread currentThread]);
        dispatch_async(concurrentQueue, ^{
            NSLog(@"--异步并发2: %@",[NSThread currentThread]);
        });
    });
    //3. 同步并发嵌套同一个同步并发队列(都不会开启新线程)
    dispatch_sync(concurrentQueue, ^{
        NSLog(@"--同步并发1: %@",[NSThread currentThread]);
        dispatch_sync(concurrentQueue, ^{
            NSLog(@"--同步并发1: %@",[NSThread currentThread]);
        });
    });
    //3. 同步并发嵌套异步并发(异步并发会开启新线程)
    dispatch_sync(concurrentQueue, ^{
        NSLog(@"--同步并发1: %@",[NSThread currentThread]);
        dispatch_async(concurrentQueue, ^{
            NSLog(@"--异步并发2: %@",[NSThread currentThread]);
        });
    });
    //4. 异步串行,嵌套同一个同步串行(外环开启新线程,内环死锁卡崩溃)
    dispatch_async(serialQueue, ^{
        NSLog(@"--异步串行1: %@",[NSThread currentThread]);
        dispatch_sync(serialQueue, ^{
            NSLog(@"--同步串发2: %@",[NSThread currentThread]);
        });
    });
    //6. 异步串行嵌套同一个异步串行(外环开启新线程,内环在外环的线程中)
    //2021-05-25 21:54:17.658046+0800 GcdDemo[51591:6655010] --异步串行1: <NSThread: 0x6000033ad400>{number = 6, name = (null)}
    //2021-05-25 21:54:17.658177+0800 GcdDemo[51591:6655010] --异步串行2: <NSThread: 0x6000033ad400>{number = 6, name = (null)}
    dispatch_async(serialQueue, ^{
        NSLog(@"--异步串行1: %@",[NSThread currentThread]);
        dispatch_async(serialQueue, ^{
            NSLog(@"--异步串行2: %@",[NSThread currentThread]);
        });
    });
    //7. 同步串行,嵌套同一个同步串行队列(内环死锁卡崩溃)
    dispatch_sync(serialQueue, ^{
        NSLog(@"--同步串行1: %@",[NSThread currentThread]);
        dispatch_sync(serialQueue, ^{
            NSLog(@"--同步串行1: %@",[NSThread currentThread]);
        });
    });
    //8. 同步串行,嵌套异步串行队列(外环不开启线程,内环开启线程)
    //2021-05-25 21:58:05.277050+0800 GcdDemo[52128:6660403] --同步串行1: <NSThread: 0x600000a30180>{number = 1, name = main}
    //2021-05-25 21:58:05.277239+0800 GcdDemo[52128:6660631] --异步串行2: <NSThread: 0x600000a65fc0>{number = 7, name = (null)}
    dispatch_sync(serialQueue, ^{
        NSLog(@"--同步串行1: %@",[NSThread currentThread]);
        dispatch_async(serialQueue, ^{
            NSLog(@"--异步串行2: %@",[NSThread currentThread]);
        });
    });


相关文章
|
3月前
|
API Swift C语言
探索iOS开发:Swift中的异步编程与GCD应用
【8月更文挑战第4天】在iOS开发的海洋中,掌握Swift语言的航向是至关重要的。本文将引领你深入理解Swift中的异步编程概念,并借助Grand Central Dispatch(GCD)这一强大的工具,来简化并发编程的复杂性。我们将通过实际代码示例,展现如何在iOS应用中高效地管理后台任务和提升用户界面的响应性。
77 3
|
4月前
|
调度 Swift Android开发
苹果iOS新手开发之Swift中的并发任务和消息机制
Swift的消息机制类似Android的Handler,实现任务调度有三种方式: 1. **Grand Central Dispatch (GCD)**:使用`DispatchQueue`在主线程或后台线程执行任务。 2. **OperationQueue**:提供高级接口管理`Operation`对象。 3. **RunLoop**:处理事件如输入源、计时器,类似Android的`Looper`和`Handler`。 **示例**: - GCD:在不同线程执行代码块。 - OperationQueue:创建操作并执行。 - RunLoop:用Timer添加到RunLoop中。
99 2
|
6月前
|
iOS开发 开发者 UED
iOS 中的并发编程:GCD 与 Operation 的对比与实践
【4月更文挑战第23天】 在iOS开发中,为了提高应用的性能和响应能力,理解并合理运用并发编程是至关重要的。本文将深入探讨两种主要的并发模式:Grand Central Dispatch (GCD) 和 NSOperation。我们将比较它们的优势和局限性,并通过代码示例演示如何在实际场景中应用这两种技术来优化应用性能。文章旨在为开发者提供一个清晰的指南,以便在选择适合自己项目的并发工具时做出明智的决策。
|
6月前
|
调度 iOS开发 开发者
iOS 中的并发编程模式:理解 GCD 和 Operation Queues
【4月更文挑战第19天】 在现代 iOS 应用开发中,有效地管理线程和并发是至关重要的。为了确保用户界面的流畅性和后台任务的高效运行,开发者需要掌握并发编程技术。本文深入探讨了两种主要的并发模式:Grand Central Dispatch (GCD) 和 Operation Queues。我们将分析它们的工作原理,比较它们的特点,并通过实际代码示例说明如何在 iOS 应用中实现高效的并发处理。通过本文,读者将获得在 iOS 平台上进行多线程开发的实用知识,以及如何根据不同的应用场景选择最合适的并发工具。
|
6月前
|
API 调度 iOS开发
多线程和异步编程:什么是 GCD(Grand Central Dispatch)?如何在 iOS 中使用 GCD?
多线程和异步编程:什么是 GCD(Grand Central Dispatch)?如何在 iOS 中使用 GCD?
73 1
|
安全 调度 C语言
iOS多线程之GCD-同步、异步、并发、串行、线程组、栅栏函数、信号量等全网最全的总结
iOS多线程之GCD-同步、异步、并发、串行、线程组、栅栏函数、信号量等全网最全的总结
969 1
|
消息中间件 存储 API
iOS小技能:队列管理推送通知,解决收款到账并发语音播报问题。
需求:收款到账语音提醒功能 NSE是比Voip更优雅的解决方案,完成迁移后,总体代码量也比Voip方案少了不少。
303 0
iOS小技能:队列管理推送通知,解决收款到账并发语音播报问题。
|
iOS开发
iOS中的多线程与GCD队列关系
iOS中的多线程与GCD队列关系
185 0
iOS中的多线程与GCD队列关系
|
存储 网络性能优化 调度
iOS-底层原理 28:GCD 之 底层原理分析
iOS-底层原理 28:GCD 之 底层原理分析
223 0
iOS-底层原理 28:GCD 之 底层原理分析
|
程序员 调度 C语言
iOS-底层原理 26:GCD 之 函数与队列
iOS-底层原理 26:GCD 之 函数与队列
163 0
iOS-底层原理 26:GCD 之 函数与队列