一个简单的定时器(NSTimer)的封装
在项目开发中我们有的时候需要用到计时器,比如登录超时,scrollview的滚动等,那么就让我们自己手动的去创建一个类库吧。
1 首先你需要一个向外提供创建的便捷方法。
- 1.1 这里考虑两种情况,一种是我创建了定时器马上就要开启,另一种情况 则是我不想马上开始。
- 1.3 然后你需要知道多久运行一次,
- 1.4 多久向外面发送一次消息。
- 1.5 还有尽量的去达到一个低耦合高内聚的这么一个思想,所以我们把消息变成一个block也集成在创建方法中,达到高内聚。
- 1.6 为了低耦合,我们在方法名之前加上pq_这样子的前缀
于是乎这样子的一个类方法就创建完了
/**
* 快速创建一个定时器,用type区分要不要一开始就执行
*
* @param type
* @param interval
* @param repeatInterval
* @param block
*
* @return
*/
+ (instancetype)pq_createTimerWithType:(PQ_TimerType)type updateInterval:(NSTimeInterval)interval repeatInterval:(NSTimeInterval)repeatInterval update:(TimerUpdateBlock)block
2 方法的实现
+ (instancetype)pq_createTimerWithType:(PQ_TimerType)type updateInterval:(NSTimeInterval)interval repeatInterval:(NSTimeInterval)repeatInterval update:(TimerUpdateBlock)block{
PQ_TimerManager * timerManager = [[self alloc]init];
//多少秒更新一次
timerManager.timeSumInterval = interval;
//多少秒执行一次
timerManager.repeatTime = repeatInterval;
//保存block
timerManager.updateBlock = block;
//判断类型
if(type == PQ_TIMERTYPE_CREATE_OPEN){
[timerManager pq_open];
}
return timerManager;
}
3 定时器至少需要提供两个最基本的方法,开启和关闭
/**
* 打开
*/
- (void)pq_open{
//开启之前先关闭定时器
[self pq_close];
//把计数器归零
self.timeInterval = 0;
//创建timer
self.timer = [NSTimer scheduledTimerWithTimeInterval:self.repeatTime target:self selector:@selector(pq_timeUpdate) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
self.isStart = YES;
}
//更新时间
- (void)pq_timeUpdate{
//如果不是开始 直接返回 并且归零计数器
if (!self.isStart) {
return;
}
self.timeInterval ++;
NSLog(@"%f",self.timeInterval);
if (self.timeInterval == self.timeSumInterval) {
self.timeInterval = 0;
self.updateBlock();
}
}
/**
* 关闭
*/
- (void)pq_close{
[self.timer setFireDate:[NSDate distantFuture]];
self.timer = nil;
}
4到上面基本上一个定时器就封装好啦,现在我们在添加一些方法,让它用起来更简单,如果你有特殊需求也可以继续的丰满它。
/**
* 把时间设置为零
*/
- (void)pq_updateTimeIntervalToZero{
self.timeInterval = 0;
}
/**
* 更新现在的时间
*
* @param interval
*/
- (void)pq_updateTimeInterval:(NSTimeInterval)interval{
self.timeInterval = interval;
}
/**
* 开机计时
*/
- (void)pq_start{
self.isStart = YES;
}
/**
* 暂停计时
*/
- (void)pq_pause{
self.isStart = NO;
}
/**
* 开始计时器
*/
- (void)pq_distantPast{
[self.timer setFireDate:[NSDate distantPast]];
}
/**
* 暂停计时器
*/
- (void)pq_distantFuture{
[self.timer setFireDate:[NSDate distantFuture]];
}
5 使用
self.timerManager = [PQ_TimerManager pq_createTimerWithType:PQ_TIMERTYPE_CREATE_OPEN updateInterval:3 repeatInterval:1 update:^{
//这里处理事件、UI
}];
6 结束语
我只是对NSTimer进行的很简单的封装,其中可能有逻辑不是很合理的地方,如果您发现了,麻烦告知。当然了,如果刚好对你有用,也麻烦给个星。
demo地址 https://github.com/codepgq/PQSimpleTimer
一个简单的定时器(NSTimer)的封装的更多相关文章
- [Java定时器]用Spring Task实现一个简单的定时器.
今天做一个项目的的时候需要用到定时器功能.具体需求是: 每个月一号触发一次某个类中的方法去拉取别人的接口获取上一个月份车险过期的用户.如若转载请附上原文链接:http://www.cnblogs.co ...
- 使用Windows service创建一个简单的定时器
一.需求 我们有时候可能会想要做一些定时任务,例如每隔一段时间去访问某个网站,或者下载一些东西到我们服务器上等等之类的事情,这时候windows service 是一个不错的选择. 二.实现 1.打开 ...
- Tcp/ip实验准备:一个简单的定时器——boost实现
tcp/ip实验须要在指定的时间查看结果,为了实验方便,做了一个定时器.用法是: 在命令行输入:timer 输入数字之后,计时对应秒数 输入m数字之后.计时对应分钟数(支持小数分钟数) 输入q退出. ...
- C语言中利用clock设计一个简单的定时器
time.h是C/C++中的日期和时间头文件,用于需要时间方面的函数,定义了四个变量类型.两个宏和各种操作日期和时间的函数. 其中计时函数是clock(),而与其相关的数据类型是clock_t.clo ...
- C#编写一个在asp.net core 3.1下的简单的corn模式的计划任务和一个更简单的定时器类
asp.net core 下,新增了一个BackgroundService用来实现能在后台跑一个长久运行的任务,因此,也可以用来替换掉原来使用的static的Timer组件, Timer组件主要有以下 ...
- 用vue实现一个简单的时间屏幕
前言 去年用了一个小的 app,叫做 一个木函,本来想着用来做动画优化就删掉了的,不过看到他有个时间屏幕的小工具,就点进去看了下,觉得挺好玩的,就想着能不能自己实现一下. ps: 闲话不多说,先上例子 ...
- 推荐一个简单、轻量、功能非常强大的C#/ASP.NET定时任务执行管理器组件–FluentScheduler定时器
在C#WINFORM或者是ASP.NET的WEB应用程序中,根据各种定时任务的需求,比如:每天的数据统计,每小时刷新系统缓存等等,这个时候我们得应用到定时器这个东东. .NET Framework有自 ...
- Directx11学习笔记【四】 封装一个简单的Dx11DemoBase
根据前面两个笔记的内容,我们来封装一个简单的基类,方便以后的使用. 代码和前面类似,没有什么新的内容,直接看代码吧(由于代码上次都注释了,这次代码就没怎么写注释o(╯□╰)o) Dx11DemoBas ...
- 网络游戏开发-服务器(01)Asp.Net Core中的websocket,并封装一个简单的中间件
先拉开MSDN的文档,大致读一遍 (https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/websockets) WebSocket 是一 ...
随机推荐
- yarn环境的搭建
1.首先,在zookeeper搭建成功,服务运行的基础上搭建yarn,其次,保证时间一致 2.在 /home/install/hadoop-2.5/etc/hadoop目录下配置一下几个配置文件: 第 ...
- 杨氏矩阵 leecode 提
提交网址https://oj.leetcode.com/problems/search-a-2d-matrix/ 有个矩阵中的数,从左向右递增,从上而下递增,快速查找是一个数是是否存在,剑指offer ...
- eclipse tomcat内存溢出,加大内存
保存图片失败,请点击这里获得详细信息. 加入 -Xms256M -Xmx512M -XX:PermSize=256m -XX:MaxPermSize=512m
- Win8关机 一直重启的问题 解决方案-摘自网络
win8关机时自动重启的解决方法:关闭快递启动,默认是启动的,到控制面板 – 电源选项 – 选择电源按钮的功能 – 更改当前不可用的设置 – 关机设置 – 把勾去掉 关闭快速启动.这样就不会关机一直重 ...
- pptp vpn
webalizer是一个高效的.免费的web服务器日志分析程序.其分析结果以HTML文件格式保存,从而可以很方便的通过web服务器进行浏览; http://daliang1215.iteye.com/ ...
- javascript 如何判断一个对象的类型
<!DOCTYPE html> <html> <head> </head> <body> <script type="tex ...
- [三]JFreeChart实践二
功能: 1.设置带色彩的柱状图 2.可以设置多组数据的展示 3.可以设置图标的背景色 4.可以设置柱与柱之间的距离 5.可以设置柱子上边是否显示具体的数值
- oracle 表空管理方式(LMT)、ASSM段管理方式、一级位图块、二级位图块、三级位图块。
今天是2013-12-16,今天和明天是我学习oracle生涯中一个特殊的日子.今天晚上进行了一下表空间管理方式的学习,在此记录一下笔记. 对于oracle数据库最小i/0单位是数据块,最想分配空间单 ...
- SQLite数据库如何存储和读取二进制数据
SQLite数据库如何存储和读取二进制数据 1. 存储二进制数据 SQLite提供的绑定二进制参数接口函数为: int sqlite3_bind_blob(sqlite3_stmt*, int, co ...
- Repository模式介绍汇总
1.Linq To Sql中Repository模式应用场景 http://www.cnblogs.com/zhijianliutang/archive/2012/02/24/2367305.html ...