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

相关文章

GO语言短变量声明的实现示例

《GO语言短变量声明的实现示例》在Go语言中,短变量声明是一种简洁的变量声明方式,使用:=运算符,可以自动推断变量类型,下面就来具体介绍一下如何使用,感兴趣的可以了解一下... 目录基本语法功能特点与var的区别适用场景注意事项基本语法variableName := value功能特点1、自动类型推

Java中的stream流分组示例详解

《Java中的stream流分组示例详解》Java8StreamAPI以函数式风格处理集合数据,支持分组、统计等操作,可按单/多字段分组,使用String、Map.Entry或Java16record... 目录什么是stream流1、根据某个字段分组2、按多个字段分组(组合分组)1、方法一:使用 Stri

使用Spring Cache本地缓存示例代码

《使用SpringCache本地缓存示例代码》缓存是提高应用程序性能的重要手段,通过将频繁访问的数据存储在内存中,可以减少数据库访问次数,从而加速数据读取,:本文主要介绍使用SpringCac... 目录一、Spring Cache简介核心特点:二、基础配置1. 添加依赖2. 启用缓存3. 缓存配置方案方案

Python多线程实现大文件快速下载的代码实现

《Python多线程实现大文件快速下载的代码实现》在互联网时代,文件下载是日常操作之一,尤其是大文件,然而,网络条件不稳定或带宽有限时,下载速度会变得很慢,本文将介绍如何使用Python实现多线程下载... 目录引言一、多线程下载原理二、python实现多线程下载代码说明:三、实战案例四、注意事项五、总结引

Java调用Python脚本实现HelloWorld的示例详解

《Java调用Python脚本实现HelloWorld的示例详解》作为程序员,我们经常会遇到需要在Java项目中调用Python脚本的场景,下面我们来看看如何从基础到进阶,一步步实现Java与Pyth... 目录一、环境准备二、基础调用:使用 Runtime.exec()2.1 实现步骤2.2 代码解析三、

Python中yield的用法和实际应用示例

《Python中yield的用法和实际应用示例》在Python中,yield关键字主要用于生成器函数(generatorfunctions)中,其目的是使函数能够像迭代器一样工作,即可以被遍历,但不会... 目录python中yield的用法详解一、引言二、yield的基本用法1、yield与生成器2、yi

Python多线程应用中的卡死问题优化方案指南

《Python多线程应用中的卡死问题优化方案指南》在利用Python语言开发某查询软件时,遇到了点击搜索按钮后软件卡死的问题,本文将简单分析一下出现的原因以及对应的优化方案,希望对大家有所帮助... 目录问题描述优化方案1. 网络请求优化2. 多线程架构优化3. 全局异常处理4. 配置管理优化优化效果1.

MyBatis-Plus 与 Spring Boot 集成原理实战示例

《MyBatis-Plus与SpringBoot集成原理实战示例》MyBatis-Plus通过自动配置与核心组件集成SpringBoot实现零配置,提供分页、逻辑删除等插件化功能,增强MyBa... 目录 一、MyBATis-Plus 简介 二、集成方式(Spring Boot)1. 引入依赖 三、核心机制

MySQL设置密码复杂度策略的完整步骤(附代码示例)

《MySQL设置密码复杂度策略的完整步骤(附代码示例)》MySQL密码策略还可能包括密码复杂度的检查,如是否要求密码包含大写字母、小写字母、数字和特殊字符等,:本文主要介绍MySQL设置密码复杂度... 目录前言1. 使用 validate_password 插件1.1 启用 validate_passwo

springboot整合mqtt的步骤示例详解

《springboot整合mqtt的步骤示例详解》MQTT(MessageQueuingTelemetryTransport)是一种轻量级的消息传输协议,适用于物联网设备之间的通信,本文介绍Sprin... 目录1、引入依赖包2、yml配置3、创建配置4、自定义注解6、使用示例使用场景:mqtt可用于消息发