• NSTimer_Block封装定时器的target-action成Block回调


    前言

    定时器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
  • 相关阅读:
    BZOJ 3629 JLOI2014 聪明的燕姿 约数和+DFS
    [BZOJ3594] [Scoi2014]方伯伯的玉米田 二维树状数组优化dp
    BZOJ 3319 黑白树 并查集+线段树
    BZOJ 2500 幸福的道路(race) 树上直径+平衡树
    BZOJ1875: [SDOI2009]HH去散步 图上边矩乘
    【BZOJ3887】【Usaco2015 Jan】Grass Cownoisseur Tarjan+Spfa
    NOIP2010 引水入城 贪心+DFS
    【BZOJ3038】上帝造题的七分钟2 线段树
    COGS 930. [河南省队2012] 找第k小的数 主席树
    BZOJ2631 tree(伍一鸣) LCT 秘制标记
  • 原文地址:https://www.cnblogs.com/develop-SZT/p/5265347.html
Copyright © 2020-2023  润新知