ios 给NSTimer添加Block回调版本创建方法

//
//  NSTimer+Convenience.h
//  NSTimerBlockDemo
//
//  Created by huangyibiao on 15/3/25.
//  Copyright (c) 2015年 huangyibiao. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface NSTimer (Convenience)

/**
 *  无参数无返回值Block
 */
typedef void (^HYBVoidBlock)(void);

/**
 *  创建Timer---Block版本
 *
 *  @param interval 每隔interval秒就回调一次callback
 *  @param repeats  是否重复
 *  @param callback 回调block
 *
 *  @return NSTimer对象
 */
+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)interval
                                    repeats:(BOOL)repeats
                                   callback:(HYBVoidBlock)callback;

/**
 *  创建Timer---Block版本
 *
 *  @param interval 每隔interval秒就回调一次callback
 *  @param count  回调多少次后自动暂停,如果count <= 0,则表示无限次,否则表示具体的次数
 *  @param callback 回调block
 *
 *  @return NSTimer对象
 */
+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)interval
                                    count:(NSInteger)count
                                   callback:(HYBVoidBlock)callback;

/**
 *  开始启动定时器
 */
- (void)fireTimer;

/**
 *  暂停定时器
 */
- (void)unfireTimer;

@end
//
//  NSTimer+Convenience.m
//  NSTimerBlockDemo
//
//  Created by huangyibiao on 15/3/25.
//  Copyright (c) 2015年 huangyibiao. All rights reserved.
//

#import "NSTimer+Convenience.h"

@implementation NSTimer (Convenience)

+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)interval
                                    repeats:(BOOL)repeats
                                   callback:(HYBVoidBlock)callback {
  return [NSTimer scheduledTimerWithTimeInterval:interval
                                          target:self
                                        selector:@selector(onTimerUpdateBlock:)
                                        userInfo:[callback copy]
                                         repeats:repeats];
}

+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)interval
                                      count:(NSInteger)count
                                   callback:(HYBVoidBlock)callback {
  NSDictionary *userInfo = @{@"callback"     : [callback copy],
                             @"count"        : @(count)};
  return [NSTimer scheduledTimerWithTimeInterval:interval
                                          target:self
                                        selector:@selector(onTimerUpdateCountBlock:)
                                        userInfo:userInfo
                                         repeats:YES];
}

+ (void)onTimerUpdateBlock:(NSTimer *)timer {
  HYBVoidBlock block = timer.userInfo;

  if (block) {
    block();
  }
}

+ (void)onTimerUpdateCountBlock:(NSTimer *)timer {
  static NSUInteger currentCount = 0;

  NSDictionary *userInfo = timer.userInfo;
  HYBVoidBlock callback = userInfo[@"callback"];
  NSNumber *count = userInfo[@"count"];

  if (count.integerValue <= 0) {
    if (callback) {
      callback();
    }
  } else {
    if (currentCount < count.integerValue) {
      currentCount++;
      if (callback) {
        callback();
      }
    } else {
      currentCount = 0;

      [timer unfireTimer];
    }
  }
}

- (void)fireTimer {
  [self setFireDate:[NSDate distantPast]];
}

- (void)unfireTimer {
  [self setFireDate:[NSDate distantFuture]];
}

@end

可以到github下载:https://github.com/632840804/NSTimerBlockDemo

时间: 2024-09-19 09:10:39

ios 给NSTimer添加Block回调版本创建方法的相关文章

高效的 iOS 应用版本支持方法

本文讲的是高效的 iOS 应用版本支持方法, 极少数应用程序很"奢侈"的只支持最新版本的 iOS. 设置一个较低的部署目标以及基于特定 iOS 版本的代码分支通常是很有必要的.虽然苹果公司的信息有些矛盾,还是有各种办法来完成这个.最近在这条 tweet上看到有人警告说,不要这样做: #define IsIOS7 ([[[[UIDevice currentDevice] systemVersion] substringToIndex:1] intValue]>=7) GitHub

详解iOS应用中自定义UIBarButtonItem导航按钮的创建方法_IOS

iOS系统导航栏中有leftBarButtonItem和rightBarButtonItem,我们可以根据自己的需求来自定义这两个UIBarButtonItem. 四种创建方法 系统提供了四种创建的方法: 复制代码 代码如下: - (instancetype)initWithBarButtonSystemItem:(UIBarButtonSystemItem)systemItem target:(id)target action:(SEL)action; - (instancetype)init

iOS之UIScrollview添加约束图文详解

iOS之UIScrollview添加约束图文详解 原文链接 http://www.jianshu.com/p/e4a12061776d 前言 在iOS开发中,autolayout是一个很强大的东西,用好了,能让你事半功倍,用不好,各种蛋疼.不过autolayout是很容易学的,笔者当时仅仅看了一个多小时的资料就轻松上手,相信比笔者厉害的大有人在. 不过无论多简单的东西,用起来总有不如意的地方,笔者曾经在UIScrollView的约束上折腾了很久,各种报错,各种查资料,终于在笔者不断的尝试下,找到

IOS:按钮添加手势问题

问题描述 IOS:按钮添加手势问题 我用2个for循环创建了30 个按钮 10行 3列, 现在要在按钮上加一个长按手势,应该怎么去找哪个按钮是被长按手势点击的那个 解决方案 -(void)changeLocktion:(UILongPressGestureRecognizer *)longPress{ UIButton *btn = (UIButton *)longPress.view;} 解决方案二: 在按钮上添加长按手势的一些问题iOS 添加手势ios的手势的添加 解决方案三: 响应长按消息

block回调方法怎么使用呢?

问题描述 block回调方法怎么使用呢? 本人刚开始学习IOS,block回调语法不会用,哪位大神能帮忙讲解一下,非常感谢

iOS Runntime 动态添加类方法并调用-class_addMethod_IOS

上手开发 iOS 一段时间后,我发现并不能只着眼于完成需求,利用闲暇之余多研究其他的开发技巧,才能在有限时间内提升自己水平.当然,"其他开发技巧"这个命题对于任何一个开发领域都感觉不找边际,而对于我来说,尝试接触 objc/runtime 不失为是开始深入探索 iOS 开发的第一步. 刚了解 runtime 当然要从比较简单的 api 开始,今天就罗列整理一下 class_addMethod 的相关点: 首先从文档开始. /** * Adds a new method to a cla

iOS仿微信添加标签效果(shape实现)_IOS

一. 概述 可以说微信做的用户体验太棒了,可以做到老少皆宜,给个赞,我们也同时应该告诫自己,用户体验应该向微信看齐,微信就是我们的标杆,那我们今天也来仿一仿微信添加的标签功能.只能仿着做了,真是做不到微信的那种体验.甘拜下风. 我们上篇学习了shape属性的用法,那我们今天就用shape来做下微信的标签功能.先看一下效果. 我不仅用到了shape属性,还用到了翔哥的标签布局FlowLayout跟TagFlowLayout鸿洋的博客 二.效果图 三 .定义shape 添加标签 <?xml vers

iOS给图片添加滤镜&amp;使用openGLES动态渲染图片详解及实例_IOS

iOS给图片添加滤镜&使用openGLES动态渲染图片 给图片增加滤镜有这两种方式: CoreImage / openGLES  下面先说明如何使用CoreImage给图片添加滤镜, 主要为以下步骤: #1.导入CIImage格式的原始图片 #2.创建CIFilter滤镜 #3.用CIContext将滤镜中的图片渲染出来 #4.导出渲染后的图片 参考代码: //导入CIImage CIImage *ciImage = [[CIImage alloc] initWithImage:[UIImage

iOS 运行时添加属性和方法

  第一种:runtime.h里的方法BOOL class_addProperty(Class cls, const char *name, const objc_property_attribute_t *attributes, unsigned int attributeCount) #include <objc/runtime.h> #import <Foundation/Foundation.h> @interface SomeClass : NSObject { NSSt