前言
定时器NSTimer虽然简单易用,但是目标响应机制(target-action)这种方式很容易在代码中出现代码臃肿的情况,特别是在一个文件中有大量的代码,多个定时器的时候不方便调试,因此将NSTimer封装成block回调能够有助于工作中的开发与调试.
头文件详解
为了满足多种情况下定时器的使用,现在扩展了两个接口,分为有限次数触发和无限次数触发。通过下面这些公开的接口可以很方便的使用定时器,管理好定时器的代码:
1,定时器timer重复触发的简单使用
* @param second 定时器每次触发的时间
* @param YesOrNo 是否重复
* @param actionblock 回调的block
*
* @return 返回定时器
+ (NSTimer *)timerActionWithSecond: (NSTimeInterval)second isRepeat:(BOOL)YesOrNo Action:(myTimerBlock)actionblock;
2,定时器timer有限触发次数使用
*
* @param second 定时器触发的时间
* @param count 触发次数
* @param actionblock 回调block
*
* @return 返回定时器
+ (NSTimer *)timerActionWithSecond:(NSTimeInterval)second count:(NSInteger)count Action:(myTimerBlock)actionblock;
实现详解
下面将详细的叙述如何封装NStimer,使得NStimer响应的时候处理block回调:
1,定时器timer重复触发的简单使用
+ (NSTimer *)timerActionWithSecond:(NSTimeInterval)second isRepeat:(BOOL)YesOrNo Action:(myTimerBlock)actionblock{
return [NSTimer scheduledTimerWithTimeInterval:second target:self selector:@selector(timeAction:) userInfo:[actionblock copy] repeats:YesOrNo];
}
+ (void)timeAction:(NSTimer *)timer
{
myTimerBlock actionBlock = timer.userInfo;
if (actionBlock) {
actionBlock();
}
}
2,定时器timer有限触发次数使用
+ (NSTimer *)timerActionWithSecond:(NSTimeInterval)second count:(NSInteger)count Action:(myTimerBlock)actionblock
{
NSDictionary *userInfoDic = [NSDictionary dictionaryWithObjectsAndKeys:[actionblock copy],@"blockAction",@(count),@"count", nil];
return [NSTimer scheduledTimerWithTimeInterval:second target:self selector:@selector(timeActionLimit:) userInfo:userInfoDic repeats:YES];
}
+ (void)timeActionLimit:(NSTimer *)timer
{
NSDictionary *userInfoDict = timer.userInfo;
myTimerBlock actionBlock = userInfoDict[@"blockAction"];
static NSInteger flag = 0;
if (flag < [userInfoDict[@"count"] integerValue]) {
flag ++;
if (actionBlock) {
actionBlock();
}
}else{
//当取消定时器的时候需要把定时器置空,不然定时器是没有释放的
// [timer invalidate];
// timer = nil;
}
}
封装最主要的就是如何调用你操作的block,这里是将block作为附带要传递的参数userInfo
补充
讲到这里顺便讲一下block的重定义和定时器NStimer的一些注意点:
1,block的重定义格式为: typedef (block的返回值) (^block重定义的名字) (block的参数.....)
例子1:typedef void (^myBlock)()定义的是一个没有返回 值,没有输入参数的block,重定义好的block名字为myblock. 声明一个myBlock类型的block: myBlock blockTest1 = ^() { NSLog(@"这是一个无返回值,无参数的重定义block"); } 例子2:typedef int (^myBlock1)()定义的是一个返回值为int类型 无输入参数的block,重定义好的block名字为myBlock1 声明一个myBlock1类型的block: myBlock1 blockTest1 = ^() { NSLog(@"这是一个无返回值,无参数的重定义block"); return 0; } 例子3:typedef NSInteger(^myBlock2) (NSString*,NSString*); 定义的是一个返回值为NSInteger类型的,输入参数1为NSString类型,输入参数2为NSString类型的的block,重定义好的block名字为myBlock2 声明一个myBlock2类型的block: hisBlock dis = ^(NSString *str1,NSString *str2) { return [str1 compare:str2]; };
NSTimer定时器的一些注意点
1,停止定时器,这样停止下来定时器是永久的停止,定时器无法再启动,所以应该置空,不然是没有释放掉的
[timer invalidate];
timer = nil;
2,开启,关闭定时器。关闭之后可以再启动
[timer setFireDate:[NSDate distantFuture]];//关闭定时器
[timer setFireDate:[NSDate distantPast]]; //开启定时器
源码地址:https://github.com/SZT0728/NSTimer_Block