GCD计时DEMO

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    _timeBtn = [UIButton buttonWithType:UIButtonTypeCustom];
    [_timeBtn setBackgroundImage:[UIImage imageNamed:@"short2_apply_btn_disable"] forState:UIControlStateNormal];
    [_timeBtn setBackgroundImage:[UIImage imageNamed:@"short2_apply_btn_over"] forState:UIControlStateHighlighted];
    [_timeBtn setTitle:@"发送验证码" forState:UIControlStateNormal];
    _timeBtn.frame = CGRectMake(100, 100, 150, 30);
    [_timeBtn addTarget:self action:@selector(starTime) forControlEvents:UIControlEventTouchUpInside];

    [self.view addSubview:_timeBtn];
}

- (void)starTime
{
    __block NSInteger timeout = 60; // 倒计时时间
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);

    dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC, 0 * NSEC_PER_SEC);
    dispatch_source_set_event_handler(timer, ^{
        if (timeout <= 0 ) {
            dispatch_source_cancel(timer);
            dispatch_async(dispatch_get_main_queue(), ^{
                [_timeBtn setTitle:@"发送验证码" forState:UIControlStateNormal];
                _timeBtn.userInteractionEnabled = YES;

            });
        }else{
            NSInteger seconds = timeout % 60;
            NSString *strTime = [NSString stringWithFormat:@"%.2d",seconds];
            dispatch_async(dispatch_get_main_queue(), ^{
                NSLog(@"___%@",strTime);
                [_timeBtn setTitle:[NSString stringWithFormat:@"%@秒后重新发送",strTime] forState:UIControlStateNormal];
                _timeBtn.userInteractionEnabled = NO;
            });
        }
        timeout-- ;
    });
    dispatch_resume(timer);
}

  

GCD计时DEMO,布布扣,bubuko.com

时间: 2024-10-10 15:22:12

GCD计时DEMO的相关文章

iOS UI布局-定时器

定时器是比较常用的一个UI控件,在付款.抢购时,经常会使用到.提取成一个通用的方法 /** * 倒计时GCD通用方法 * 通常用的计时器都是用NSTimer,但是NSTimer在线程很吃紧的时候效果不佳,使用GCD计时相对更好 * * @param seconds 倒计时间 单位:秒 * @param showLable 需要显示的文本框 * @param endBlock 倒计时结束后,回调的Block */ - (void)startTimerWithSeconds:(long)second

Swift3.0 GCD定时器的使用,实现倒计时,UIDatePicker的使用, 仿写一个活动倒计时的DEMO

直接看主要代码 //截止日期 let endDate = datePicker.date //开始日期 let startDate = Date() //时间间隔 let timeInterval:TimeInterval = endDate.timeIntervalSince(startDate) if timer == nil { //剩余时间 var timeout = timeInterval if timeout != 0 { //创建全局队列 let queue = Dispatch

计时 答题 demo

<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>HTML5 Timer</title> <script type="tex

iOS多线程开发之GCD 用法入门

我们知道,在iOS中进行多线程编程,主要有三种方式:[NSThread].[NSOperation]和[GCD].其中又以[GCD]为苹果官方最为推荐.本文将利用一个简单的demo,简述GCD的用法入门,以及本人对GCD的一点肤浅理解和学习心得. 先把参考文章列出: http://www.cnblogs.com/kenshincui/p/3983982.html http://www.cnblogs.com/sunfrog/p/3305614.html http://mobile.51cto.c

【iOS开发每日小笔记(九)】在子线程中使用runloop,正确操作NSTimer计时的注意点 三种可选方法

这篇文章是我的[iOS开发每日小笔记]系列中的一片,记录的是今天在开发工作中遇到的,可以用很短的文章或很小的demo演示解释出来的小心得小技巧.它们可能会给用户体验.代码效率得到一些提升,或是之前自己没有接触过的技术,很开心的学到了,放在这里得瑟一下.其实,90%的作用是帮助自己回顾.记忆.复习. 一直想写一篇关于runloop学习有所得的文章,总是没有很好的例子.正巧自己的上线App Store的小游戏<跑酷好基友>(https://itunes.apple.com/us/app/pao-k

页面实现多个定时器(计时器)时选用NSTimer还是GCD?(干货不湿)

定时器在我们每个人做的iOS项目里面必不可少,如登录页面倒计时.支付期限倒计时等等,一般来说使用NSTimer创建定时器: + (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(nullable id)userInfo repeats:(BOOL)yesOrNo; + (NSTimer *)scheduledTimerWithTimeIn

页面实现多个定时器(计时器)时选用NSTimer还是GCD

这里讲述的是页面实现多个定时器(计时器)时选用NSTimer还是GCD?(干货不湿)的文章,具体方法请看介绍 定时器在我们每个人做的iOS项目里面必不可少,如登录页面倒计时.支付期限倒计时等等,一般来说使用NSTimer创建定时器: + (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(nullable id)userInfo repea

对GCD的一些理解和实践

GCD GCD,全程Grand Central Dispatch,是苹果为了多核并行提出的解决方案.它是使用C语言实现,但是由于用了block来处理回调,所以使用起来十分方便.并且GCD会自动管理线程的生命周期,不需要我们去管理. 任务和队列 GCD中有两个重要的概念,任务和队列. 1.任务,就是我们想要处理的事情,任务可以分为同步执行和异步执行: 同步(sync):使用dispatch_sync(dispatch_queue_t queue, dispatch_block_t block) 创

画板间即时通讯demo

当我们做项目时肯定会用到即时通讯技术,当然网上第三方已经提供了许多即时通讯的接口,但是一味的使用别人的做好的产品是多么无趣,今天就做了一个关于多个画板间的即时通讯简单DEMO,用到了socket+多线程联 + handler + message联合应用的技术,废话少说,先贴图.如需下载源码,在文章最后已贴出连接. 1.项目目录结构 2.当在一个画板上画图时,另一个画板也会自动画出相应图案 3.长按可弹出菜单栏 4.选择画笔颜色 5.不同颜色绘画出的图形 6.可设置画笔宽度 7.不同宽度的画笔 8