创建GCDTimer 以及取消的问题

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

@property (nonatomic, strong) dispatch_source_t timer;

获取全局子线程队列

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

创建timer添加到队列中

 _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);

设置首次执行事件、执行间隔和精确度

dispatch_source_set_timer(_timer, dispatch_walltime(NULL, 0), 1.0*NSEC_PER_SEC,  0); //每秒执行

            dispatch_source_set_event_handler(_timer, ^{

                if(timeout <= 0){ //  当倒计时结束时做需要的操作: 关闭 活动到期不能提交

                    dispatch_source_cancel(self->_timer);

                    dispatch_async(dispatch_get_main_queue(), ^{

                        回到主线程处理UI

                    });

                } else { // 倒计时重新计算 时/分/秒

                   

                    });

                    timeout--; // 递减 倒计时-1(总时间以秒来计算)

                }

            });

            dispatch_resume(_timer);

 

这是常规的做法,但是某种情况下,如果GCDTimer在tableviewCell中,tableView reload可能会再一次的初始化GCDTimer,所以说在初始化之前需要取消之前的GCDTimer,再进行初始化,由此写了个单例把GCDTimer仍里边,代码如下

 

 

//  WPGCDtimerManager.m

//  WanPiao

//

//  Created by 俊洋洋 on 2018/8/20.

//  Copyright © 2018年 俊洋洋. All rights reserved.

//

 

#import "WPGCDtimerManager.h"

 

@interface WPGCDtimerManager()

 

@end

@implementation WPGCDtimerManager

// 单例

+ (WPGCDtimerManager *)sharedInstance

{

    static WPGCDtimerManager *_wpGCDTimerManager = nil;

    

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken,^{

        _wpGCDTimerManager = [[WPGCDtimerManager alloc] init];

    });

    

    return _wpGCDTimerManager;

}

// 取消timer

- (void)cancelOrderTimerWithName:(NSString *)timerName

{

    dispatch_source_t timer = [self.orderTimerGCDDict objectForKey:timerName];

    

    if (!timer)

        return;

    

    [self.orderTimerGCDDict removeObjectForKey:timerName];

    dispatch_source_cancel(timer);

}

 

- (NSMutableDictionary *)orderTimerGCDDict

{

    if (!_orderTimerGCDDict) {

        _orderTimerGCDDict = [[NSMutableDictionary alloc] init];

    }

    return _orderTimerGCDDict;

}

@end

 

在tableViewCell中可这样写

 

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];

    [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

//    [dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:8]];//解决8小时时间差问题

    NSDate *orderDate = [dateFormatter dateFromString:model.orderTime];

    

    NSTimeInterval interval = 60*15;

    NSDate *countDownDate = [NSDate dateWithTimeInterval:interval sinceDate:orderDate];

    

    // 倒计时的时间 测试数据

    NSString *deadlineStr = [dateFormatter stringFromDate:countDownDate];

    // 当前时间的时间戳

    NSString *nowStr = [LYTool getCurrentTimeyyyymmdd];

    // 计算时间差值

    NSInteger secondsCountDown = [LYTool getDateDifferenceWithNowDateStr:nowStr deadlineStr:deadlineStr];

    

    

        WEAKSELF

        __block NSInteger timeout = secondsCountDown; // 倒计时时间

        

        if (timeout!=0) {

            //取消之前创建的GCDTimer

            [[WPGCDtimerManager sharedInstance] cancelTimerWithName:@"ConfirmOrderTimerGCD"];

            dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

           _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);

           //记录刚创建的timer

            [[WPGCDtimerManager sharedInstance].confirmTimerGCDDict setObject:_timer forKey:@"ConfirmOrderTimerGCD"];

            dispatch_source_set_timer(_timer, dispatch_walltime(NULL, 0), 1.0*NSEC_PER_SEC,  0); //每秒执行

            dispatch_source_set_event_handler(_timer, ^{

                if(timeout <= 0){ //  当倒计时结束时做需要的操作: 关闭 活动到期不能提交

                    dispatch_source_cancel(self->_timer);

                    dispatch_async(dispatch_get_main_queue(), ^{                 

                    });

                } else { // 倒计时重新计算 时/分/秒

                    dispatch_async(dispatch_get_main_queue(), ^{

                    });

                    timeout--; // 递减 倒计时-1(总时间以秒来计算)

                }

            });

            dispatch_resume(_timer);

    }

GCD定时器接口封装 个人最近学习回顾了定时器相关内容知识点,这里做一下笔记: 注:接口内容包含了 创建定时器及执行定时器任务; 取消定时器任务; 关键代码加锁:定时器唯一标识操作加锁 .h文件 #import <Foundation/Foundation.h> NS_ASSUME_NONNULL_BEGIN @interface GHTimer : NSObject +(NSString *)execTask:(void(^)(void))task ... 阅读详情

相关推荐

深入解析iOS GCD计时器的封装与应用

首先,我们需要理解什么是并发编程。并发编程是通过同时执行多任务来提高应用程序性能的技术。在多核处理器上,真正的并行执行可以缩短程序执行的时间。在单核处理器上,多任务可以通过快速交替执行来实现,从而给用户一种程序正在同时执行多个任务的错觉。让我们通过一个案例来分析GCD Timer的性能优化。假设一个应用需要每10秒执行一次数据库查询操作,传统方法可能需要在主线程上设置定时器,但这样会导致界面卡顿。通过GCD Timer,我们可以在后台队列上执行此任务,然后通过代理或闭包将结果传回主线程。

weixin_42510243的博客 664

iOS_定时器:NSTimer、GCDTimer、DisplayLink

在iOS里用个Timer(定时器)真的是太麻烦了,一不小心就不work了,一不小心又导致内存泄露了~ 反正就是得非常注意,下面就来聊聊计时器: Timer工作原理 首先我们得了解Timer是怎么工作的: 首先它需要加到RunLoop中,RunLoop会在固定时间触发Timer的回调。这个Timer是被存放在RunLoop的Model的_timers数组里,是强引用的。(之前的文章有介绍RunLoop的结构) 因此我们需要在持有Timer的对象(如:ViewController,本文就以ViewControl

mikimo的博客 4079

iOS GCD timer 计时器

iOS GCD timer 计时器 自己封装直接使用即可 GCD实现的计时器解决timer内存不好管理问题。

iOS 定时器使用(Timer 和 CGD)

在程序开发中,我们常常借助定时器完成定时任务,比如短信验证码倒计时、运动计时等具有时间序列概念的操作。 最常用的定时方式有Timer 和GCD dispatchTimer Timer的使用 Timer 官方文档 Timer/NSTimer: 在某个时间间隔之后触发的定时器,向目标对象发送指定的消息。 Timer 的完成往往配合runloop和相应的 mode。 初始化 创建即添加到当前 runloop 通过带 scheduledxxx方法初始化的定时器,创建就会添加到当前 runloop ,且以 defau

小桥流水哗啦啦,iOS Coder 哒哒哒 4091

Qt 插件开发 plugin 超详细 有源码

Qt 插件化开发框架类似于前后端的微服务的场景,授权哪个微服务则前端可以使用哪个微服务,插件就行硬件插卡一样,可以被随时删除、插入和修改,所以结构很灵活,容易修改,方便软件的升级和维护;插件主要面向接口编程,无需访问.lib文件,热插拔、利于团队开发。即使在程序运行时.dll不存在,也可以正常启动,只是相应插件功能无法正常使用而已;动态库需要访问.lib文件,而且在程序运行时必须保证.lib存在,否则无法正常启动;

q610098308的专栏 6545

初识Classic AUTOSAR开发工具链

在过去,软件和硬件之间具有很强的耦合性,阻碍了软件组件在不同硬件平台上的可移植性和重用性。而AUTOSAR作为汽车电子行业的标准,提供标准的软件接口定义,工程师可以根据需求将软件组件分配到汽车的ECU中,实现标准软件组件的可重用性。

怿星科技的博客 8092

GCD定时器(GCD Timer)

时间来不及了,赶快上车… /// 创建一个Timer // /** // dispatch_source创建方法 // // @param type 创建的dispatch_source的类型 // @param handle // @param mask // @param queue 添加到的队列 // @return 返回一个新创...

MeteoriteMan的博客 2533

浅谈车联网概述-1

车联网技术目前在车企中应用广泛,车联网通过车载传感器、无线通信等技术,能够将车辆上百的传感器数据上传至云端,当前智能网联车辆可以理解为一个“大号”手机。

Hello, World! 新能源汽车智能网联工程师,分享日常工作思考。 559

GCDTimer 使用教程

GCDTimer 使用教程 项目介绍 GCDTimer 是一个基于 Grand Central Dispatch (GCD) 的定时器库,适用于 iOS 和 macOS 平台。它提供了比 NSTimer 更高精度和更好性能的定时器实现。GCDTimer 利用 GCD 的线程池和任务调度,能够实现多核并发,避免主线程 RunLoop 的堵塞问题,从而更好地满足应用程序的性能需求。 项目快速启动 安装...

gitblog_01032的博客 512

Cadence SpectreRF仿真避坑指南:PSS和Pnoise设置详解(附实战案例)

本文详细解析了Cadence SpectreRF中PSS(周期稳态分析)和Pnoise(周期噪声分析)的关键设置技巧,帮助模拟IC设计工程师避开常见仿真陷阱。通过实战案例分享,涵盖引擎选择、Beat Frequency计算、噪声类型配置等核心参数优化策略,提升仿真精度与效率。特别针对开关电容电路和振荡器等复杂场景提供专业解决方案。

weixin_42613501的博客 601

ubuntu安装glibc

VSCode 在ubuntu下调试无法打开libc-start.c raise.c等1. 安装glibc2. launch.json中添加路径映射3. 调试 1. 安装glibc apt install glibc-source cd /usr/src/glibc/ sudo tar -xvf glibc-[VERSION].tar.xz 2. launch.json中添加路径映射 "sourceFileMap": { "/build/glibc-S7xCS9": "/usr/src/glib

wq_0708的博客 3万+

iOS GCD定时器的使用

GCDTimer类,使用时导入该类即可。

iOS15011015的博客 1311

西门子 S7-200 SMART 系列六:手把手教你配置S7-200 SMART Modbus RTU

Modbus 是公开通信协议,其最简单的串行通信部分仅规定了在串行线路的基本数据传输格式。Modbus 具有两种串行传输模式,ASCII 和 RTU,它们定义了数据如何打包、解码的不同方式。支持 Modbus 协议的设备一般都支持 RTU 格式。

John_09040211的博客 7431

iOS定时器 GCDTimer

iOS GCDTimer工具类的封装、可以下载直接使用,有问题相互学习。

Mars.Lee的专栏 1268

71、聚二甲基硅氧烷(PDMS)材料模型验证研究

本研究通过实验与数值模拟相结合的方法,系统探究了聚二甲基硅氧烷(PDMS)的力学性能与粘附行为。重点验证了多种超弹性材料模型在不同剥离速率下的适用性,结果表明Ogden N2模型在预测界面韧性和平均剥离力方面误差最小,表现最优。研究涵盖了PDMS的合成、单轴拉伸试验、剥离测试及有限元分析,为PDMS在机械与摩擦学领域的应用提供了可靠的建模依据,并建议在后续模拟中优先采用Ogden模型。

wine的专栏 1052

Python 爬虫 + 数据分析:社会调查数据抓取与结果可视化分析

在当今数字化时代,数据已成为推动社会发展的关键资源之一。无论是市场调研、学术研究还是政策制定,社会调查数据都扮演着至关重要的角色。通过 Python 爬虫技术,我们可以高效地获取这些数据,并结合数据分析与可视化工具,深入挖掘数据背后的价值。本文将通过一个完整的实战项目,带你掌握如何使用 Python 爬虫抓取社会调查数据,并进行可视化分析。

yansideyucsdn的博客 126

JX_GCDTimer 项目使用教程

JX_GCDTimer 项目使用教程 1、项目的目录结构及介绍 JX_GCDTimer/ ├── JX_GCDTimer/ │ ├── JX_GCDTimerManager.h │ ├── JX_GCDTimerManager.m ├── JX_GCDTimerDemo/ │ ├── AppDelegate.h │ ├── AppDelegate.m │ ├── main.m ...

gitblog_00480的博客 566

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

ios NSTimer和GCDtimer对比

NSTimer这个大家用的比较多, _timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerAction) userInfo:nil repeats:YES]; // 取消的时候 [self.timer invalidate]; self.tim...

gcs的博客 1521

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

NSTimer不准确与GCDTimer详解

NSTimer不准,scheduleTimer放在runloop里面,受runloop模式影响会不准 //    [NSTimer scheduledTimerWithTimeInterval: target: selector: userInfo: repeats:]; 所以创建GCD定时器 //dispatch_source_t timer = dispatch_source_cre

YUSIR 完美CODING世界 2424

用dispatch_source实现可取消的定时器

1 在开发的过程中,定时器是一个必不可少的功能,我们可以用NStimer,CADisplayLink,GCD Timer CADisplayLink 是一个保持屏幕同频率的计时器类,一般用在动画或者视频的渲染,不是作为定时器事件来用的。 NSTimer不多讲,这个刚入门的iOS开发者用的大多都是这个,而且大部分情况下能够实现我们的功能。比如取消已经在队列的任务。这个就需要用到GCD Timer

我就是小伟哥的专栏 6497

iOS多线程终极指南:GCD与NSOperationQueue最佳实践详解

iOS开发中,多线程处理是提升应用性能的关键技术。无论是优化界面流畅度还是处理复杂后台任务,掌握Grand Central Dispatch(GCD)和NSOperationQueue都是iOS开发者必备的核心技能。本文将为你详细介绍这两种主流多线程技术的最佳实践,帮助你构建高性能、响应迅速的iOS应用。😊 ## 🎯 为什么需要多线程处理? 在iOS应用开发中,**多线程处理**至关重要,

gitblog_01196的博客 422

GCD线程与runloop中添加timer的见解

GCD与NSTimer 很多时候,我们需要在自己的项目中重复、延迟、周期性的执行某一项任务,也可能在某一个时间点取消掉自己已经延迟或重复的任务 显而易见,延迟操作我们最经常使用的是GCD的dispatch_after,但延迟操作一共有三种方法,今天就简单说说其中的区别 1.NSObject的对象方法: - (void)performSelector:(SEL)aSelector w

dragongd的博客 2181

选择 GCD 还是 NSTimer ?

我们常常会延迟某件任务的执行,或者让某件任务周期性的执行。然后也会在某些时候需要取消掉之前延迟执行的任务。 延迟操作的方案一般有三种: 1.NSObject的方法: gcdTimer 2.使用NSTimer的方法: gcdTimer 3.使用GCD的方法: gcdTimer 一般情况下,我们选择使用GCD的di

小白的专栏 763

GCD 和Timer

GCD中 进行页面切换的时候 主线程一直刷新倒计时 __blockinttimeout =2400;//倒计时时间 dispatch_queue_tqueue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0); dispatch_source_t_timer =dis...

weixin_30384031的博客 78

从NSTimer的失效性谈起(二):关于GCD Timer和libdispatch

一、GCD Timer的创建和安放 虽然GCD Timer并不依赖于NSRunLoop,但是有没有可能在某种情况下,GCD Timer也失效了?就好比一开始我们也不知道NSTimer对应着一个runloop的某种mode。 先来看看GCD Timer的使用方法: dispatch_source_t timer = dispat...

weixin_34190136的博客 254
上一篇: iOS界面之间的跳转
下一篇: app应用跳转apptore评分页面
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值