前言

定时器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

NSTimer_Block封装定时器的target-action成Block回调的更多相关文章

  1. BlocksKit初见:一个支持将delegate转换成block的Cocoa库

    简介 项目主页: https://github.com/zwaldowski/BlocksKit BlocksKit 是一个开源的框架,对 Cocoa 进行了扩展,将许多需要通过 delegate 调 ...

  2. UI基础:target...action设计模式,手势识别器.UIimageview

    使用target..action和delegate设计模式可以实现解耦.使代码更加优化. 手势识别器: 手势识别器:是对触摸事件做了封装,无需自己去判断某个手势是否触发,手势识别器本身起到了识别作用, ...

  3. struts2封装客户端数据到Action

    1.在Action中定义简单数据类型的属性 给Action定义简单类型的属性,封装客户端请求的数据 简单类型:String,基本类型和对应的引用类型 只要保证客户端请求的参数名称和Action的属性名 ...

  4. 代码块(Block)回调一般阐述

    本章教程主要对代码块回调模式进行讲解,已经分析其他回调的各种优缺点和适合的使用场景. 代码块机制 Block变量类型 Block代码封装及调用 Block变量对普通变量作用域的影响 Block回调接口 ...

  5. iOS 键盘添加完成按钮,delegate和block回调

    这个是一个比较初级一点的文章,新人可以看看.当然实现这个需求的时候自己也有一点收获,记下来吧. 前两天产品要求在工程的所有数字键盘弹出时,上面带一个小帽子,上面安装一个“完成”按钮,这个完成按钮也没有 ...

  6. 第十篇、自定义UIBarButtonItem和UIButton block回调

    // 自定义导航栏左边按钮 self.navigationItem.leftBarButtonItem = [JQBlockedBarButtonItem blockedBarButtonItemWi ...

  7. 63.delegate回调 和block回调

    效果:viewController里面放置一个按钮和Lab,点击按钮进入oneViewController(delegate回调)或者BlockViewController(block回调),两者控制 ...

  8. Objective-C中的Block回调模式

    在前面的博客中提到了Block的概念和使用方法,个人感觉Block最爽的用法莫过于在回调时用block.感觉比委托回调和目标方法回调用着要顺手,好不好用还得读者亲自用一下才知道.如果 读者之前用过SS ...

  9. OC3大回调模式使用总结(三)block回调

    OC 3大回调模式使用总结(三)block回调 block 又称 代码块,闭包等 是一个匿名的函数,它能够当做一个对象来使用,仅仅只是这个对象非常特殊,是一段代码,他能够保存你写的一段预备性质代码,待 ...

随机推荐

  1. 小议C#接口的隐式与显示实现

    小弟不才,各位大牛嘴下留情... 一.对于继承类里头有相同方法时候,用接口方式去调用,会优先查走显式接口方法 例如 public interface IA { void Test(); } publi ...

  2. Ubuntu不能上网解决办法

     一.设置IP.网关.DNS 新安装的Ubuntu系统ifconfig后发现没有ip,所以要设置IP.网关.DNS等,编辑 /etc/networking/interfases sudo vi /et ...

  3. 细说Mammut大数据系统测试环境Docker迁移之路

    欢迎访问网易云社区,了解更多网易技术产品运营经验. 前言 最近几个月花了比较多精力在项目的测试环境Docker迁移上,从最初的docker"门外汉"到现在组里的同学(大部分测试及少 ...

  4. 「BZOJ 2152」聪聪可可

    题目链接 戳这 \(Solution\) 这道题看起来就像点分治对吧.没错就是点分治. 什么是点分治 如果你不会点分治,可以去看看这儿 现在看到这里,首先确保你已经会了点分治,如果不会你还往下看,听不 ...

  5. c++迭代递归实现汉诺塔(5种迭代方法满足你)

    #include <iostream> //从A到C using namespace std; int n; void ready() { cout << "请输入汉 ...

  6. Kotlin when 流程判断

    如果学过C或者java C#等语言. 一定熟悉SWITCH这个流程判断 但是在kotlin中却没有这个.而是 使用了When来代替. 当什么时候. 下面我觉一个简单的例子: import java.u ...

  7. java web高级编程 笔记1

    chapter1:了解web应用程序 web应用程序主要组件: Servlet 过滤器 监听器 JSP chapter2:各类web容器介绍 略 chapter3:Servlet介绍 Servlet是 ...

  8. Invalid App Store Icon. The App Store Icon in the asset catalog in 'xxx.app' can’t be transparent nor contain an alpha channel.

    1.向appstore上传应用的时候,报了这样一个错误 ERROR ITMS-90717: "Invalid App Store Icon. The App Store Icon in th ...

  9. 设置使用的python版本

    一.查看当前使用的python版本,或设置使用的python版本 二.python2中默认使用ASCII码,无法识别中文,报错如图,解决办法,设置字符集为utf-8

  10. Jmeter环境搭建详细介绍

    [前言] 欢迎来到我的博客,知识在于分享,如有不足之处,希望指出,大家共同进步学习! [JDK检查和安装] 现在市面上比较普遍的性能测试工具无非就LoadRunner和Jmeter,本人一直秉持着便宜 ...