Swift3.0 GCD多线程示例

2024-06-18 22:18
文章标签 多线程 示例 swift3.0 gcd

本文主要是介绍Swift3.0 GCD多线程示例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

///
func mainThread(){// 开一条全局队列异步执行任务DispatchQueue.global().async {/*  Group的用法*  1. notify(依赖任务), 必须和 enter/leave在同一队列才会执行*  2. wait(任务等待)*  3. enter/leave 手动管理group计数,enter和leave必须配对, 可以不需要wait()*/let group = DispatchGroup()var subTask: [DispatchQueue] = [DispatchQueue]()/* // 主线程DispatchQueue.main.async {  //通知ui刷新print("Main 刷新 UI: Begin")group.wait()Thread.sleep(forTimeInterval: 1)   //停止1秒print("Main 刷新 UI: End")}   // *///初始化8个子线程for i in 0...7{subTask.append(DispatchQueue(label: "subTask\(i)", attributes: .concurrent))}//启动8个子线程任务for item in subTask{group.enter()   //把该任务添加到组队列中执行, enter和leave必须配对item.async(group: group) {Thread.sleep(forTimeInterval: 1)   //停止1秒print("\(Date().description) subTask.label = \(item.label)")DispatchQueue.main.async(group: group, execute: refreshMainUI(dq: item))     // 通知主线程刷新UIgroup.leave()   //执行完之后从组队列中移除}group.notify(queue: item){ // 对应的子线程完成后,扫尾任务print("\(item.label) finished,do something more")// *** 此处可添加 对应的子线程完成后的扫尾任务sleep(10)}}}// 通知主线程刷新UI, 有需要在主线程中执行的代码,请添加到此func refreshMainUI(dq:DispatchQueue) -> DispatchWorkItem{let workItem = DispatchWorkItem {print("Refresh main UI: \(dq.label): Hello world! ")// *** 此处可添加 UI 刷新任务Thread.sleep(forTimeInterval: 5)   //停止1秒}return workItem}
}

Logs 如下:

 ****** Cyril Test Start ******2019-01-16 09:35:44 +0000 Main: Execute mainThread()****** Cyril Test End ******
Waitting all test done.
2019-01-16 09:35:44 +0000 subTask.label = subTask3
2019-01-16 09:35:44 +0000 subTask.label = subTask5
2019-01-16 09:35:44 +0000 subTask.label = subTask1
2019-01-16 09:35:44 +0000 subTask.label = subTask7
2019-01-16 09:35:44 +0000 subTask.label = subTask0
2019-01-16 09:35:44 +0000 subTask.label = subTask2
2019-01-16 09:35:44 +0000 subTask.label = subTask6
2019-01-16 09:35:44 +0000 subTask.label = subTask4
All test done.
Refresh main UI: subTask2: Hello world! 
Refresh main UI: subTask3: Hello world! 
Refresh main UI: subTask1: Hello world! 
Refresh main UI: subTask0: Hello world! 
subTask0 finished,do something more
subTask2 finished,do something more
subTask3 finished,do something more
subTask1 finished,do something more
subTask4 finished,do something more
Refresh main UI: subTask4: Hello world! 
subTask5 finished,do something more
subTask6 finished,do something more
subTask7 finished,do something more
Refresh main UI: subTask5: Hello world! 
Refresh main UI: subTask7: Hello world! 
Refresh main UI: subTask6: Hello world! 

最新代码放在gitlab上:

https://gitlab.com/cyril_j/mutils/blob/master/Swift/mainThread.swift

这篇关于Swift3.0 GCD多线程示例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1073212

相关文章

Javaee多线程之进程和线程之间的区别和联系(最新整理)

《Javaee多线程之进程和线程之间的区别和联系(最新整理)》进程是资源分配单位,线程是调度执行单位,共享资源更高效,创建线程五种方式:继承Thread、Runnable接口、匿名类、lambda,r... 目录进程和线程进程线程进程和线程的区别创建线程的五种写法继承Thread,重写run实现Runnab

SpringBoot线程池配置使用示例详解

《SpringBoot线程池配置使用示例详解》SpringBoot集成@Async注解,支持线程池参数配置(核心数、队列容量、拒绝策略等)及生命周期管理,结合监控与任务装饰器,提升异步处理效率与系统... 目录一、核心特性二、添加依赖三、参数详解四、配置线程池五、应用实践代码说明拒绝策略(Rejected

SQL中如何添加数据(常见方法及示例)

《SQL中如何添加数据(常见方法及示例)》SQL全称为StructuredQueryLanguage,是一种用于管理关系数据库的标准编程语言,下面给大家介绍SQL中如何添加数据,感兴趣的朋友一起看看吧... 目录在mysql中,有多种方法可以添加数据。以下是一些常见的方法及其示例。1. 使用INSERT I

SpringBoot中SM2公钥加密、私钥解密的实现示例详解

《SpringBoot中SM2公钥加密、私钥解密的实现示例详解》本文介绍了如何在SpringBoot项目中实现SM2公钥加密和私钥解密的功能,通过使用Hutool库和BouncyCastle依赖,简化... 目录一、前言1、加密信息(示例)2、加密结果(示例)二、实现代码1、yml文件配置2、创建SM2工具

MySQL 定时新增分区的实现示例

《MySQL定时新增分区的实现示例》本文主要介绍了通过存储过程和定时任务实现MySQL分区的自动创建,解决大数据量下手动维护的繁琐问题,具有一定的参考价值,感兴趣的可以了解一下... mysql创建好分区之后,有时候会需要自动创建分区。比如,一些表数据量非常大,有些数据是热点数据,按照日期分区MululbU

Python函数作用域示例详解

《Python函数作用域示例详解》本文介绍了Python中的LEGB作用域规则,详细解析了变量查找的四个层级,通过具体代码示例,展示了各层级的变量访问规则和特性,对python函数作用域相关知识感兴趣... 目录一、LEGB 规则二、作用域实例2.1 局部作用域(Local)2.2 闭包作用域(Enclos

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

ModelMapper基本使用和常见场景示例详解

《ModelMapper基本使用和常见场景示例详解》ModelMapper是Java对象映射库,支持自动映射、自定义规则、集合转换及高级配置(如匹配策略、转换器),可集成SpringBoot,减少样板... 目录1. 添加依赖2. 基本用法示例:简单对象映射3. 自定义映射规则4. 集合映射5. 高级配置匹