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异步/延时使用初步封装相关推荐

  1. Swift5多线程系列一GCD基础篇

    Swift5多线程系列-基础概念篇 iOS开发,多线程开发常用GCD,swift也如是;swift的GCD,使用比OC上更加简单易上手; GCD基础篇目录 Swift5多线程系列-基础概念篇 基础篇 ...

  2. iOS多线程系列之GCD栅栏(barrier)实现同步锁

    多线程编程中很容易出现资源竞争的问题,比如异步读写操作造成数据不同步.那么解决这一问题多线程编程中提供了一种同步机制叫同步锁.iOS中实现同步锁机制的方案不止一种,这里主要介绍一下强大的GCD给出的方 ...

  3. .NET异步和多线程系列(四)- 多线程异常处理、线程取消、多线程的临时变量问题、线程安全和锁lock

    本文是.NET异步和多线程系列第四章,主要介绍的是多线程异常处理.线程取消.多线程的临时变量问题.线程安全和锁lock等. 一.多线程异常处理 多线程里面抛出的异常,会终结当前线程,但是不会影响别的线 ...

  4. iOS多线程开发之GCD(基础篇)

    总纲: GCD基本概念 GCD如何实现 GCD如何使用 队列和任务组合 一.GCD基本概念 GCD 全称Grand Central Dispatch(大中枢队列调度),是一套低层API,提供了⼀种新的 ...

  5. iOS 多线程:『GCD』详尽总结

    原文链接:www.jianshu.com/p/2d57c7201- 感谢大家对这篇文章的喜欢和支持.为了不辜负大家的喜欢,也为了更好的让大家了解 iOS 多线程,以及 GCD 的相关知识,我对这篇文章 ...

  6. terminated 线程_Java【多线程系列】JUC线程池—2. 原理(二)、Callable和Future

    在"Java多线程系列--"基础篇"01之 基本概念"中,我们介绍过,线程有5种状态:新建状态,就绪状态,运行状态,阻塞状态,死亡状态.线程池也有5种状态:然而 ...

  7. Java多线程系列--“JUC线程池”06之 Callable和Future

    转载自  Java多线程系列--"JUC线程池"06之 Callable和Future Callable 和 Future 简介 Callable 和 Future 是比较有趣的一 ...

  8. Java多线程系列(四):4种常用Java线程锁的特点,性能比较、使用场景

    多线程的缘由 在出现了进程之后,操作系统的性能得到了大大的提升.虽然进程的出现解决了操作系统的并发问题,但是人们仍然不满足,人们逐渐对实时性有了要求. 使用多线程的理由之一是和进程相比,它是一种非常花 ...

  9. java线程 教程_Java多线程系列教程

    Java多线程系列教程 多线程是Java中不可避免的一个重要主体.从本章开始,我们将展开对多线程的学习.接下来的内容是对Java多线程内容的讲解,涉及到的内容包括,Object类中的wait(), n ...

最新文章

  1. dycom游戏抽象空间框架正式版(alpha1.0)
  2. springboot使用Redis作缓存使用入门
  3. Android CardView的基本使用
  4. mac系统升级 brew 是用不了_PostgreSQL数据库默默升级,导致数据库服务不可用
  5. java query object_Object Query Language (OQL) query 基本使用
  6. 做了5年程序员才明白,这项能力原来这么重要
  7. BGP中的环路和次优路径问题
  8. LeetCode ZigZag Conversion(将字符串排成z字型)
  9. Restlet 学习笔记
  10. 视觉里程计 matlab实现,基于CarSim和Matlab的智能车辆视觉里程计仿真平台设计
  11. 【蓝桥杯练习-PWM脉宽调制】
  12. 聊聊技术人的“绩效考核”
  13. JavaScript 销毁对象
  14. 超级好用的cmd工具软件:Cmder
  15. 个人微信小程序云开发总结心得
  16. 计算机网络战队名称大全,游戏战队名字大全要霸气
  17. linux redis查看密码,Redis集群设置密码和查看密码方法
  18. kingscada检测服务器状态,组态王隧道监控解决方案(KingSCADA).ppt
  19. FOMO游戏代码解析
  20. matlab求解费米积分,小弟有疑问 关于费米积分的

热门文章

  1. GB/T 4768防霉包装
  2. 看看我们以后谁混得好
  3. Error: rpmdb open failed 使用 yum进行安装时,出现这个错误的解决方式
  4. Foxmail7.2账号帐号邮件备份和恢复
  5. C++写的是男人就下一百层小游戏,基于EasyX图形库(本人菜鸟)
  6. 摩根大通为ETH区块链的支付机制开发了新的隐私增强工具
  7. 关于提示:You asked to pull from the remote 'xxx', but did not specify a branch.
  8. 本地html本地xml文件怎么打开,xml文件怎么打开
  9. json graphql_使用json-graphql-server模拟GraphQL API
  10. 2288hv5超融合服务器 数码管报888