开发过程中,我们可能会经常使用到计时器。苹果为我们提供了Timer。但是在平时使用过程中会发现使用Timer会有许多的不便
1:必须保证在一个活跃的runloop,我们知道主线程的runloop是活跃的,但是在其他异步线程runloop就需要我们自己去开启,非常麻烦。
2:Timer的创建和销毁必须在同一个线程。跨线程就操作不了
3:内存问题。可能循环引用造成内存泄露

由于存在上述问题,我们可以采用GCD封装来解决。

import UIKit
typealias ActionBlock = () -> ()class MRGCDTimer: NSObject {static let share = MRGCDTimer()lazy var timerContainer = [String : DispatchSourceTimer]()/// 创建一个名字为name的定时////// - Parameters:///   - name: 定时器的名字///   - timeInterval: 时间间隔///   - queue: 线程///   - repeats: 是否重复///   - action: 执行的操作func scheduledDispatchTimer(withName name:String?, timeInterval:Double, queue:DispatchQueue, repeats:Bool, action:@escaping ActionBlock ) {if name == nil {return}var timer = timerContainer[name!]if timer==nil {timer = DispatchSource.makeTimerSource(flags: [], queue: queue)timer?.resume()timerContainer[name!] = timer}timer?.schedule(deadline: .now(), repeating: timeInterval, leeway: .milliseconds(100))timer?.setEventHandler(handler: { [weak self] inaction()if repeats==false {self?.destoryTimer(withName: name!)}})}/// 销毁名字为name的计时器////// - Parameter name: 计时器的名字func destoryTimer(withName name:String?) {let timer = timerContainer[name!]if timer == nil {return}timerContainer.removeValue(forKey: name!)timer?.cancel()}/// 检测是否已经存在名字为name的计时器////// - Parameter name: 计时器的名字/// - Returns: 返回bool值func isExistTimer(withName name:String?) -> Bool {if timerContainer[name!] != nil {return true}return false}}
使用方法
MRGCDTimer.share.scheduledDispatchTimer(withName: "name", timeInterval: 1, queue: .main, repeats: true) {//codeself.updateCounter()}
取消计时器
MRGCDTimer.share.destoryTimer(withName: "name")

Swift4 使用GCD实现计时器相关推荐

  1. 用例子看Swift4的GCD

    关于GCD基础知识的文章很多,但很多都停留在iOS早期版本的状态,随着iOS的升级GCD的使用也随之升级了,下面举了很多例子来看一看. 1.串行队列使用同步运行 1.普通队列同步运行 let queu ...

  2. iOS开发-多线程编程技术(Thread、Cocoa operations、GCD)

    简介 在软件开发中,多线程编程技术被广泛应用,相信多线程任务对我们来说已经不再陌生了.有了多线程技术,我们可以同做多个事情,而不是一个一个任务地进行.比如:前端和后台作交互.大任务(需要耗费一定的时间 ...

  3. IOS开发之多线程 -- GCD的方方面面

    前言:这篇GCD的博文是本人阅读了很多海内外大神的关于GCD的文章,以及结合之前自己对GCD的粗浅的认识,然后取其精华,去其槽粕,综合起来的笔记,而且是尽可能的以通熟易懂的并且是正确的理论论述方式呈现 ...

  4. iOS_定时器:NSTimer、GCDTimer、DisplayLink

    文章目录 一.NSTimer 1. 工作原理 2. 初始化方法的区别 3. 8种初始化方法: 4. 不work的原因 5. 内存泄露 6. 对self的强引用的解决方案 6.1. target 使用类 ...

  5. iOS - RunLoop 深入理解

    一直不是很了解iOS的runloop机制的具体机制,无意间搜到这个文章,感觉非常详细,收藏了- 作者费不少劲写的,转载请注明出处,谢谢侬.-原文作者:Mitchell 孟晨 于是出处:原文地址 后面我 ...

  6. 计时器延迟 NSTimer和CADisplaylink GCD中的延迟

    1,NStimer时间间隔比较大,大于1秒: CADisplayLink 时间间隔比较小,0.01秒: 2,创建启动计时器: [NSTimer scheduledTimeInterval:0.5 ta ...

  7. swift 多线程GCD和延时调用

    GCD 是一种非常方便的使用多线程的方式.通过使用 GCD,我们可以在确保尽量简单的语法的前提下进行灵活的多线程编程.在 "复杂必死" 的多线程编程中,保持简单就是避免错误的金科玉 ...

  8. GCD介绍(三): Dispatch Sources

    何为Dispatch Sources 简单来说,dispatch source是一个监视某些类型事件的对象.当这些事件发生时,它自动将一个block放入一个dispatch queue的执行例程中. ...

  9. GCD介绍(一): 基本概念和Dispatch Queue

    什么是GCD? Grand Central Dispatch或者GCD,是一套低层API,提供了一种新的方法来进行并发程序编写.从基本功能上讲,GCD有点像NSOperationQueue,他们都允许 ...

最新文章

  1. R400换XP 所有驱动程序安装一览表
  2. 实战:将企业域名解析委派给企业DNS服务器
  3. 微信小程序 推送模板教程 附源码
  4. [过年菜谱之]清蒸鲍鱼
  5. django进阶04部署上线(nginx,uwsgi,supervisor)
  6. 人工智能应用在会计工作中的优势
  7. html文档树形结构图
  8. Mac 应用开发--Cocoa运用程序显示或隐藏MainNemu
  9. 【51单片机】:智能交通灯设计(带车流量计数和蜂鸣功能)
  10. Office产品 “您的组织策略阻止我们为您完成此操作” 解决办法
  11. 利用R语言进行具有周期性的时间序列分析
  12. [MCM] MTSP问题的GA求解 多目标优化 (单起点 与 多起点)
  13. vue脚手架安装步骤详情
  14. php和ar的关系,vr与ar的区别
  15. 基于Yahoo网站性能优化的34条军规及自己的见解
  16. 理解PHP网页运行原理
  17. Windows 10 下载
  18. Ubuntu20.04 用 `hwclock` 或 `timedatectl` 设置RTC硬件时钟为本地时区
  19. 24. bootstrap组件#折叠菜单
  20. 【HarmonyOS HiSpark Wi-Fi IoT HarmonyOS开发板】初探

热门文章

  1. 如何实现动易官方网站内容页的移动菜单效果?
  2. JAVA编程思想第四版笔记 十、内部类
  3. 一个简单的TTS文语转换实例
  4. c语言中单引号b是啥意思,c语言中单引号和双引号的区别和应用?
  5. 不让「数据孤岛」成为 AI 发展的绊脚石,「联邦学习」将成突破口?...
  6. endnote 进行 convert to plain text操作后word格式大变问题解决办法
  7. MATLAB - Modbus TCP客户端的使用
  8. Safeboxie电脑版多开助手多开操作方法:
  9. 脱式计算机在线使用,三年级数学脱式计算500题可直接打印
  10. 最新爆料 !公众号很有必要接入微社区吗?