Swift5多线程系列一GCD异步/延时使用初步封装
Swift5多线程系列一GCD异步/延时使用初步封装
GCD异步延时使用初步目录
- Swift5多线程系列一GCD异步/延时使用初步封装
- 前言
- 一、封装成基本的struct
- 二、基本使用
- 1.异步初步任务基本使用
- 2. 延迟执行任务基本使用
- 总结
前言
上一篇介绍了GCD的基本概率,这篇主要基本实战,初步封装。
一、封装成基本的struct
Tip: 可以新建一个AsyncStuct.swift,直接当做工具类使用
import Foundation
public typealias Task = () -> Voidstruct AsyncStuct {/// async 追加异步任务/// - Parameter task: 异步任务逃逸闭包public static func async(_ task: @escaping Task) {_async(task)}/// async 追加异步任务,并执行回到主线程任务/// - Parameters:/// - task: 异步任务逃逸闭包/// - mainTask: 主线线程逃逸任务public static func async(_ task: @escaping Task,_ mainTask: @escaping Task){_async(task, mainTask)}/// _async 追加异步任务,并执行回到主线程任务具体实现/// - Parameters:/// - task: 异步任务逃逸闭包/// - mainTask: 回到主线任务闭包private static func _async(_ task: @escaping Task,_ mainTask: Task? = nil){let item = DispatchWorkItem(block: task)DispatchQueue.global().async(execute: item)if let main = mainTask {item.notify(queue: DispatchQueue.main, execute: main)}}/// 异步延迟任务/// - Parameters:/// - seconds: 延时时间/// - task: 延时异步并发任务/// - Returns: 延时异步处理的 DispatchWorkItem@discardableResultpublic static func asyncDelay(_ seconds: Double,_ task: @escaping Task) -> DispatchWorkItem {return _asyncDelay(seconds, task)}/// 异步延迟任务/// - Parameters:/// - seconds: 延时时间/// - task: 延时异步并发任务/// - mainTask: 延时异步并发任务回到主线程任务/// - Returns: 延时异步处理的 DispatchWorkItem@discardableResultpublic static func asyncDelay(_ seconds: Double,_ task: @escaping Task,_ mainTask: @escaping Task) -> DispatchWorkItem {return _asyncDelay(seconds, task, mainTask)}private static func _asyncDelay(_ seconds: Double,_ task: @escaping Task,_ mainTask: Task? = nil) -> DispatchWorkItem{let item = DispatchWorkItem(block: task)DispatchQueue.global().asyncAfter(deadline: DispatchTime.now() + seconds, execute: item)if let main = mainTask {item.notify(queue: DispatchQueue.main, execute: main)}return item}
}
二、基本使用
1.异步初步任务基本使用
代码如下(示例):
AsyncStuct.async {print("Thread.current -> \(Thread.current)")
}
AsyncStuct.async({print("Thread.current -> \(Thread.current)")
}){print("Thread.current -> \(Thread.current)")
}
2. 延迟执行任务基本使用
代码如下(示例):
let dispatchItem = AsyncStuct.asyncDelay(3) {print("1Thread.current -> \(Thread.current)")
} _: {print("2Thread.current -> \(Thread.current)")
}DispatchQueue.global().asyncAfter(deadline: .now() + 0.005) {print("Thread.current 被取消 -> \(Thread.current)")dispatchItem.cancel()
}
print("main Thread.current -> \(Thread.current)")
运行结果
main Thread.current -> <_NSMainThread: 0x6000020e8500>{number = 1, name = main}
Thread.current 被取消 -> <NSThread: 0x6000020c4080>{number = 4, name = (null)}
2Thread.current -> <_NSMainThread: 0x6000020e8500>{number = 1, name = main}
总结
例如:以上就是今天要讲的内容,本文仅仅简单介绍了swift的异步和延迟基本使用。
Swift5多线程系列一GCD异步/延时使用初步封装相关推荐
- Swift5多线程系列一GCD基础篇
Swift5多线程系列-基础概念篇 iOS开发,多线程开发常用GCD,swift也如是;swift的GCD,使用比OC上更加简单易上手; GCD基础篇目录 Swift5多线程系列-基础概念篇 基础篇 ...
- iOS多线程系列之GCD栅栏(barrier)实现同步锁
多线程编程中很容易出现资源竞争的问题,比如异步读写操作造成数据不同步.那么解决这一问题多线程编程中提供了一种同步机制叫同步锁.iOS中实现同步锁机制的方案不止一种,这里主要介绍一下强大的GCD给出的方 ...
- .NET异步和多线程系列(四)- 多线程异常处理、线程取消、多线程的临时变量问题、线程安全和锁lock
本文是.NET异步和多线程系列第四章,主要介绍的是多线程异常处理.线程取消.多线程的临时变量问题.线程安全和锁lock等. 一.多线程异常处理 多线程里面抛出的异常,会终结当前线程,但是不会影响别的线 ...
- iOS多线程开发之GCD(基础篇)
总纲: GCD基本概念 GCD如何实现 GCD如何使用 队列和任务组合 一.GCD基本概念 GCD 全称Grand Central Dispatch(大中枢队列调度),是一套低层API,提供了⼀种新的 ...
- iOS 多线程:『GCD』详尽总结
原文链接:www.jianshu.com/p/2d57c7201- 感谢大家对这篇文章的喜欢和支持.为了不辜负大家的喜欢,也为了更好的让大家了解 iOS 多线程,以及 GCD 的相关知识,我对这篇文章 ...
- terminated 线程_Java【多线程系列】JUC线程池—2. 原理(二)、Callable和Future
在"Java多线程系列--"基础篇"01之 基本概念"中,我们介绍过,线程有5种状态:新建状态,就绪状态,运行状态,阻塞状态,死亡状态.线程池也有5种状态:然而 ...
- Java多线程系列--“JUC线程池”06之 Callable和Future
转载自 Java多线程系列--"JUC线程池"06之 Callable和Future Callable 和 Future 简介 Callable 和 Future 是比较有趣的一 ...
- Java多线程系列(四):4种常用Java线程锁的特点,性能比较、使用场景
多线程的缘由 在出现了进程之后,操作系统的性能得到了大大的提升.虽然进程的出现解决了操作系统的并发问题,但是人们仍然不满足,人们逐渐对实时性有了要求. 使用多线程的理由之一是和进程相比,它是一种非常花 ...
- java线程 教程_Java多线程系列教程
Java多线程系列教程 多线程是Java中不可避免的一个重要主体.从本章开始,我们将展开对多线程的学习.接下来的内容是对Java多线程内容的讲解,涉及到的内容包括,Object类中的wait(), n ...
最新文章
- dycom游戏抽象空间框架正式版(alpha1.0)
- springboot使用Redis作缓存使用入门
- Android CardView的基本使用
- mac系统升级 brew 是用不了_PostgreSQL数据库默默升级,导致数据库服务不可用
- java query object_Object Query Language (OQL) query 基本使用
- 做了5年程序员才明白,这项能力原来这么重要
- BGP中的环路和次优路径问题
- LeetCode ZigZag Conversion(将字符串排成z字型)
- Restlet 学习笔记
- 视觉里程计 matlab实现,基于CarSim和Matlab的智能车辆视觉里程计仿真平台设计
- 【蓝桥杯练习-PWM脉宽调制】
- 聊聊技术人的“绩效考核”
- JavaScript 销毁对象
- 超级好用的cmd工具软件:Cmder
- 个人微信小程序云开发总结心得
- 计算机网络战队名称大全,游戏战队名字大全要霸气
- linux redis查看密码,Redis集群设置密码和查看密码方法
- kingscada检测服务器状态,组态王隧道监控解决方案(KingSCADA).ppt
- FOMO游戏代码解析
- matlab求解费米积分,小弟有疑问 关于费米积分的
热门文章
- GB/T 4768防霉包装
- 看看我们以后谁混得好
- Error: rpmdb open failed 使用 yum进行安装时,出现这个错误的解决方式
- Foxmail7.2账号帐号邮件备份和恢复
- C++写的是男人就下一百层小游戏,基于EasyX图形库(本人菜鸟)
- 摩根大通为ETH区块链的支付机制开发了新的隐私增强工具
- 关于提示:You asked to pull from the remote 'xxx', but did not specify a branch.
- 本地html本地xml文件怎么打开,xml文件怎么打开
- json graphql_使用json-graphql-server模拟GraphQL API
- 2288hv5超融合服务器 数码管报888