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

相关文章

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. 高级配置匹

C++11作用域枚举(Scoped Enums)的实现示例

《C++11作用域枚举(ScopedEnums)的实现示例》枚举类型是一种非常实用的工具,C++11标准引入了作用域枚举,也称为强类型枚举,本文主要介绍了C++11作用域枚举(ScopedEnums... 目录一、引言二、传统枚举类型的局限性2.1 命名空间污染2.2 整型提升问题2.3 类型转换问题三、C

Java实现自定义table宽高的示例代码

《Java实现自定义table宽高的示例代码》在桌面应用、管理系统乃至报表工具中,表格(JTable)作为最常用的数据展示组件,不仅承载对数据的增删改查,还需要配合布局与视觉需求,而JavaSwing... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

C++ 检测文件大小和文件传输的方法示例详解

《C++检测文件大小和文件传输的方法示例详解》文章介绍了在C/C++中获取文件大小的三种方法,推荐使用stat()函数,并详细说明了如何设计一次性发送压缩包的结构体及传输流程,包含CRC校验和自动解... 目录检测文件的大小✅ 方法一:使用 stat() 函数(推荐)✅ 用法示例:✅ 方法二:使用 fsee

mysql查询使用_rowid虚拟列的示例

《mysql查询使用_rowid虚拟列的示例》MySQL中,_rowid是InnoDB虚拟列,用于无主键表的行ID查询,若存在主键或唯一列,则指向其,否则使用隐藏ID(不稳定),推荐使用ROW_NUM... 目录1. 基本查询(适用于没有主键的表)2. 检查表是否支持 _rowid3. 注意事项4. 最佳实

HTML中meta标签的常见使用案例(示例详解)

《HTML中meta标签的常见使用案例(示例详解)》HTMLmeta标签用于提供文档元数据,涵盖字符编码、SEO优化、社交媒体集成、移动设备适配、浏览器控制及安全隐私设置,优化页面显示与搜索引擎索引... 目录html中meta标签的常见使用案例一、基础功能二、搜索引擎优化(seo)三、社交媒体集成四、移动