#import "ViewController.h"

@interface ViewController ()
@property (nonatomic ,strong)UIButton *btn;
@property (nonatomic ,assign)NSInteger secondsCountDown;
@property (nonatomic ,strong)NSTimer *countDownTimer;
@end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
self.btn = [UIButton buttonWithType:UIButtonTypeCustom];
self.btn.frame = CGRectMake(, , , );
self.btn.backgroundColor = [UIColor yellowColor];
[self.btn setTitle:@"获取验证码" forState:UIControlStateNormal]; //设置文字颜色
[self.btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; //添加点击事件
[self.btn addTarget:self action:@selector(startTimeGCD) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:self.btn];
}

1、NSTimer

//使用NSTimer实现倒计时功能
- (void)startTime {
//设置倒计时总时长
self.secondsCountDown = ;
self.countDownTimer = [NSTimer scheduledTimerWithTimeInterval: target:self selector:@selector(startTimeNSTimer) userInfo:nil repeats:YES];
[self.btn setTitle:[NSString stringWithFormat:@"%ld秒后重新发送",(long)self.secondsCountDown] forState:UIControlStateNormal];
} //使用NSTimer实现倒计时
- (void)startTimeNSTimer {
self.secondsCountDown -- ;
self.btn.userInteractionEnabled = NO;
[self.btn setTitle:[NSString stringWithFormat:@"%ld秒后重新发送",(long)self.secondsCountDown] forState:UIControlStateNormal];
if (self.secondsCountDown == ) {
[self.countDownTimer invalidate];
self.btn.userInteractionEnabled = YES;
[self.btn setTitle:@"重新发送验证码" forState:UIControlStateNormal];
}
}

2、GCD

//使用GCD实现倒计时
- (void)startTimeGCD {
//在block内部不可以修改外部变量,需要添加__block进行修饰
//设置倒计时总时长
__block int timeout = ;
//创建队列(全局并发队列)
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, );
dispatch_source_t _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, , ,queue);
dispatch_source_set_timer(_timer,dispatch_walltime(NULL, ),1.0*NSEC_PER_SEC, ); //每秒执行
dispatch_source_set_event_handler(_timer, ^{
if(timeout <= ){
//倒计时结束,关闭
dispatch_source_cancel(_timer);
//回到主线程更新UI
dispatch_async(dispatch_get_main_queue(), ^{
//设置界面的按钮显示 根据自己需求设置
[self.btn setTitle:@"发送验证码" forState:UIControlStateNormal];
self.btn.userInteractionEnabled = YES;
});
}else{
int seconds = timeout % ;
NSString *strTime = [NSString stringWithFormat:@"%.2d", seconds];
dispatch_async(dispatch_get_main_queue(), ^{
//设置界面的按钮显示 根据自己需求设置
//NSLog(@"____%@",strTime);
// [UIView beginAnimations:nil context:nil];
// [UIView setAnimationDuration:1];
[self.btn setTitle:[NSString stringWithFormat:@"%@秒后重新发送",strTime] forState:UIControlStateNormal];
// [UIView commitAnimations];
self.btn.userInteractionEnabled = NO;
});
timeout--;
}
});
dispatch_resume(_timer);
}

倒计时实现两种方法-NSTimer/GCD的更多相关文章

  1. ios实现倒计时的两种方法

    方法1:使用NSTimer来实现 主要使用的是NSTimer的scheduledTimerWithTimeInterval方法来每1秒执行一次timeFireMethod函数,timeFireMeth ...

  2. ios开发——实用技术OC篇》倒计时实现的两种方法

    倒计时实现的两种方法 timeFireMethod函数,timeFireMethod进行倒计时的一些操作,完成时把timer给invalidate掉就ok了,代码如下: secondsCountDow ...

  3. iOS活动倒计时的两种实现方式

    代码地址如下:http://www.demodashi.com/demo/11076.html 在做些活动界面或者限时验证码时, 经常会使用一些倒计时突出展现. 现提供两种方案: 一.使用NSTime ...

  4. windows下获取IP地址的两种方法

    windows下获取IP地址的两种方法: 一种可以获取IPv4和IPv6,但是需要WSAStartup: 一种只能取到IPv4,但是不需要WSAStartup: 如下: 方法一:(可以获取IPv4和I ...

  5. android 之 启动画面的两种方法

    现在,当我们打开任意的一个app时,其中的大部分都会显示一个启动界面,展示本公司的logo和当前的版本,有的则直接把广告放到了上面.启动画面的可以分为两种设置方式:一种是两个Activity实现,和一 ...

  6. [转载]C#读写txt文件的两种方法介绍

    C#读写txt文件的两种方法介绍 by 大龙哥 1.添加命名空间 System.IO; System.Text; 2.文件的读取 (1).使用FileStream类进行文件的读取,并将它转换成char ...

  7. php如何防止图片盗用/盗链的两种方法(转)

    图片防盗链有什么用? 防止其它网站盗用你的图片,浪费你宝贵的流量.本文章向大家介绍php防止图片盗用/盗链的两种方法 Apache图片重定向方法 设置images目录不充许http访问 Apache服 ...

  8. WPF程序将DLL嵌入到EXE的两种方法

    WPF程序将DLL嵌入到EXE的两种方法 这一篇可以看作是<Visual Studio 版本转换工具WPF版开源了>的续,关于<Visual Studio 版本转换工具WPF版开源了 ...

  9. MongoDB实现分页(两种方法)

    1.插入实验数据 偷懒用下samus,100条. ; i < ; i++) { Document doc = new Document(); doc["ID"] = i; d ...

随机推荐

  1. 揭秘uc浏览器一

    首先,看一下项目完成后的,最终效果是这样的: 一.主界面 二,书签界面 三.主界面 四.操作对话框界面 这几个界面你是否看到了uc浏览器的影子了,其实我说你也可以了,在接下来篇幅中,我将手把手叫大家完 ...

  2. Openstack中为虚拟机使用CDROM光驱设备

    在Libvirt里处理 在nova里处理 实际效果 怎么卸载 在Libvirt里处理 尝试了下面有几种方法,为虚拟机载入光盘文件: 1.使用ide方式挂载: virsh attach-disk {in ...

  3. Java7,AutoClosable

    Java 7的try-with-resource语法的目的是提高Java开发人员的效率,使得他们不需要在编写代码时考虑资源释放问题,大多数的这类"清理"问题是由于异常发生时清理方法 ...

  4. 【转】npm install、npm install --save与npm install --save-dev区别

    原文: https://blog.csdn.net/qq_30378229/article/details/78463930 ------------------------------------- ...

  5. wamp因配置错误而导致apache无法启动的问题

    在使用wamp搭建一个PHP项目环境时,却出现了apache无法启动的问题   通过查看window的错误日志才发现apache出现了错误   错误的原因说的很清楚,是因为配置文件中的Director ...

  6. Intellij idea断点 Debugger slow: Method breakpoints my dramatically slow down debugging

    不知道点到哪里了,IDEA调试特别卡,而且总是如下提示, Debugger slow: Method breakpoints my dramatically slow down debugging 意 ...

  7. HighCharts设置图表背景透明

    其实就一句话: backgroundColor: 'rgba(0,0,0,0)' 完整示例: $(function () { $('#container').highcharts({ chart: { ...

  8. JavaScript:如何获得 Private、Privileged、Public 和 Static 成员(属性和方法)【翻译+整理】

    本文内容 背景 把我们的对象放在一起 添加一个私有(Private)的属性 添加一个特权(Privileged)的方法 添加一个公共(Public)的属性和方法 添加一个静态(Static)的属性 我 ...

  9. SQL Server 之 附加数据库出现“ 拒绝访问 ”

    错误信息如下图所示,附加数据库时出现“拒绝访问”:   解决方案: 修改拒绝访问的文件的安全权限,这里是修改数据库的.mdf文件的安全权限.

  10. 微信小程序 - 沉浸式抽屉(非组件)

    高度有限制,可作为管理界面,点击下载示例:drawer