在项目开发中我们有的时候需要用到计时器,比如登录超时,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)的封装的更多相关文章

  1. [Java定时器]用Spring Task实现一个简单的定时器.

    今天做一个项目的的时候需要用到定时器功能.具体需求是: 每个月一号触发一次某个类中的方法去拉取别人的接口获取上一个月份车险过期的用户.如若转载请附上原文链接:http://www.cnblogs.co ...

  2. 使用Windows service创建一个简单的定时器

    一.需求 我们有时候可能会想要做一些定时任务,例如每隔一段时间去访问某个网站,或者下载一些东西到我们服务器上等等之类的事情,这时候windows service 是一个不错的选择. 二.实现 1.打开 ...

  3. Tcp/ip实验准备:一个简单的定时器——boost实现

    tcp/ip实验须要在指定的时间查看结果,为了实验方便,做了一个定时器.用法是: 在命令行输入:timer 输入数字之后,计时对应秒数 输入m数字之后.计时对应分钟数(支持小数分钟数) 输入q退出. ...

  4. C语言中利用clock设计一个简单的定时器

    time.h是C/C++中的日期和时间头文件,用于需要时间方面的函数,定义了四个变量类型.两个宏和各种操作日期和时间的函数. 其中计时函数是clock(),而与其相关的数据类型是clock_t.clo ...

  5. C#编写一个在asp.net core 3.1下的简单的corn模式的计划任务和一个更简单的定时器类

    asp.net core 下,新增了一个BackgroundService用来实现能在后台跑一个长久运行的任务,因此,也可以用来替换掉原来使用的static的Timer组件, Timer组件主要有以下 ...

  6. 用vue实现一个简单的时间屏幕

    前言 去年用了一个小的 app,叫做 一个木函,本来想着用来做动画优化就删掉了的,不过看到他有个时间屏幕的小工具,就点进去看了下,觉得挺好玩的,就想着能不能自己实现一下. ps: 闲话不多说,先上例子 ...

  7. 推荐一个简单、轻量、功能非常强大的C#/ASP.NET定时任务执行管理器组件–FluentScheduler定时器

    在C#WINFORM或者是ASP.NET的WEB应用程序中,根据各种定时任务的需求,比如:每天的数据统计,每小时刷新系统缓存等等,这个时候我们得应用到定时器这个东东. .NET Framework有自 ...

  8. Directx11学习笔记【四】 封装一个简单的Dx11DemoBase

    根据前面两个笔记的内容,我们来封装一个简单的基类,方便以后的使用. 代码和前面类似,没有什么新的内容,直接看代码吧(由于代码上次都注释了,这次代码就没怎么写注释o(╯□╰)o) Dx11DemoBas ...

  9. 网络游戏开发-服务器(01)Asp.Net Core中的websocket,并封装一个简单的中间件

    先拉开MSDN的文档,大致读一遍 (https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/websockets) WebSocket 是一 ...

随机推荐

  1. HW5.12

    public class Solution { public static void main(String[] args) { printChars('1', 'Z', 10); } public ...

  2. Codeforces126B - Password(KMP)

    题目大意 给定一个字符串S,要求你找到一个最长的子串,它既是S的前缀,也是S的后缀,并且在S的内部也出现过(非端点) 题解 KMP的失配函数f[i]的非零值就是前i个字符的一个最长前缀且也是后缀的字符 ...

  3. 使用WIF实现单点登录Part I——Windows Identity Foundation介绍及环境搭建 -摘自网络

    上个月有一个星期的时间都在研究asp.net mvc统一身份验证及单点登录的实现.经过了一番的探索,最终决定使用微软的Windows Identity Foundation.但是这东西用的人貌似不多, ...

  4. gridview合并单元格

    记录用,以前写过,忘记了转自:http://marss.co.ua/MergingCellsInGridView.aspx public class GridDecorator { public st ...

  5. 关于学习Scala语言的一些感悟

    进入话题! 我们知道哈,Spark源码采用Scala语言编写,那么阅读Spark源码之前,是否一定先学Scala呢? 我个人认为,不必,只要我们有一些java或c++编写语言的基础,就可以看Spaar ...

  6. CSS3最简洁的轮播图

    <!DOCTYPE html> <html> <head> <title>CSS3最简洁的轮播图</title> <style> ...

  7. git 初级

    以前工作中用到git,但没有总结,这次借鉴其它博客加上自己实践,总结git的简单用法 首先安装.... 打开一个文件右击git bash 弹出来一个jit界面 git config http.post ...

  8. windows 下安装elasticsearch

    1.下载 elasticsearch-2.3.3.zip 注意::elasticsearch 版本太高的话,java运行不起来 elasticsearch-1.5.2下载地址 http://downl ...

  9. struts2的json-default和struts-default的区别

    http://www.cnblogs.com/lbangel/archive/2013/05/24/3096986.html struts2的json plugin可以实现struts2和json的完 ...

  10. eclipse mybatis Generator

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...