创建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

UVM概述及uvm_component和uvm_object(一)

UVM:Universal Verification Methodology(通用验证方法学) UVM:是建立在systemverilog平台上的一个库,提供了一系列的接口,让我们能够更方便的进行验证。验证平台组成: Driver:用来把不同的激励施加给DUT; Monitor:用来检测DUT的输出; Scoreboard:专门用来比较期望值与monitor检测到的DUT输出; Refer

南国之邱 1万+

大数据应用技术实验报告一 Hadoop三种模式安装配置

JDK+Hadoop安装配置、单机模式配置 以下操作在SecureCRT里面完成 1.关闭防火墙 firewall-cmd --state 显示防火墙状态running/not running systemctl stop firewalld 临时关闭防火墙,每次开机重新开启防火墙 systemctl disable firewalld 禁止防火墙服务。 2.传输JDK和HADOOP压缩包 Sec...

Ruthless_Childe的博客 3090

GCD定时器(GCD Timer)

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

MeteoriteMan的博客 2533

VS2022+Qt6保姆级配置指南:从插件安装到项目互通全流程(附常见错误解决)

本文提供了一份详细的Visual Studio 2022与Qt6集成开发环境配置指南。从插件安装、环境搭建到项目创建与互通,涵盖了全流程操作步骤,并针对常见的配置错误和调试问题提供了实用的解决方案,帮助开发者高效构建企业级桌面应用。

nginx7reverse的博客 1203

GCDTimer 使用教程

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

gitblog_01032的博客 512

从投影到抗噪:直线拟合三大算法实战指南

本文深入解析了直线拟合的三大核心算法:常规最小二乘法(OLS)、正交回归(TLS)和RANSAC。通过对比其几何原理、代码实现与适用场景,为计算机视觉和数据分析领域的实践者提供了清晰的选型指南,帮助在抗噪、旋转不变性等不同需求下,精准选择并应用最合适的算法。

ujm567890的博客 576

极智AI | 谈谈为什么卷积加速更喜欢 NHWC Layout

本文主要讨论一下为什么卷积加速更加喜欢 NHWC 的数据排布。

极智视界 2970

iOS GCD定时器的使用

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

iOS15011015的博客 1311

基于 Simulink 的飞轮储能系统(Flywheel Energy Storage System, FESS)充放电协调控制实战教程

本教程详细介绍了基于Simulink的飞轮储能系统(FESS)建模与控制方法。系统采用永磁同步电机(PMSM)和背靠背变流器架构,包含机侧全速域矢量控制和网侧直流稳压控制。重点讲解了机电耦合建模、FOC控制算法实现、基于电压下垂的协调控制策略,以及混合储能系统设计思路。教程提供了MATLAB函数代码示例,并给出典型工况下的仿真波形分析指南,同时指出了常见问题解决方案。该模型可用于研究飞轮储能在调频、能量回收等场景的应用,为新能源消纳和微网稳定提供仿真工具。

MHD0815的博客 166

iOS定时器 GCDTimer

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

Mars.Lee的专栏 1268

PDF格式分析(一)简介

概述 PDF文件是一种编程形式的文档格式,它所有显示的内容,都是通过相应的操作符进行绘制的。 PDF基本显示单元包括:文字,图片,矢量图,图片 PDF扩展单元包括:水印,电子署名,注释,表单,多媒体,3D PDF动作单元:书签,超链接(初学者可以简单这么理解,对于研究比较深入的人员来说,拥有动作的单元有很多个,包括电子署名,多媒体,3D等等) 优势 一致性: 在所有可以打开PDF的机...

steve_cui的博客 2万+

【华为OD机试真题】439、精准核酸检测 | 机试真题+思路参考+代码解析 (C++、Java、Py、C语言、JS)

题目描述 >为了达到新冠疫情精准防控的需要,为了避免全员核酸检测带来的浪费,需要精准圈定可能被感染的人群现在根据传染病流调以及大数据分析,得到了每个人之间在时间、空间上是否存在轨迹的交叉。现在给定一组确诊人品编号(X1 X2 X3.....n)在所有人当中,找出哪些人票要进行核酸检测,输出需要进行核酸检测的人数。(注意:确诊病例自身不需要再做核酸检) >  需要进行核酸检测的人,是病毒传播链条上的所有人员,即有可能通过确诊病例所能传播到的所有人   例如:A是确诊病例,A和B有接触、B和

KJ.JK 1433

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

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

ios NSTimer和GCDtimer对比

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

gcs的博客 1521

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

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、付费专栏及课程。

余额充值