GCD 和Timer

GCD中 进行页面切换的时候 主线程一直刷新倒计时

__block int timeout = 2400; //倒计时时间

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_walltime(NULL, 0),1.0*NSEC_PER_SEC, 0); //没秒执行

dispatch_source_set_event_handler(_timer, ^{

if(timeout<=0){ //倒计时结束,关闭

dispatch_source_cancel(_timer);

dispatch_async(dispatch_get_main_queue(), ^{

//设置界面的按钮显示 根据自己需求设置

UIAlertView * alert = [[UIAlertView alloc]initWithTitle:@"提示" message:@"即将送达"delegate:nil cancelButtonTitle:nil otherButtonTitles:@"确定",@"取消", nil];

[alert show];

});

}else{

int minutes = timeout / 60;

NSString * strTime = [NSString stringWithFormat:@"%d",minutes];

dispatch_async(dispatch_get_main_queue(), ^{

//设置界面的按钮显示 根据自己需求设置

UIView * timeView = [[UIView alloc]initWithFrame:CGRectMake(10, 140, 150, 150)];

timeView.layer.cornerRadius = 75;

timeView.layer.borderWidth = 4;

timeView.layer.borderColor = [UIColor colorWithRed:0.816 green:0.820 blue:0.824alpha:1.000].CGColor;

timeView.backgroundColor = [UIColor whiteColor];

[_mainView addSubview:timeView];

UILabel * tLabel = [[UILabel alloc]initWithFrame:CGRectMake(55, 0, 60, 60)];

tLabel.text = @"剩余";

tLabel.textColor = [UIColor blackColor];

tLabel.font = [UIFont systemFontOfSize:20];

[timeView addSubview:tLabel];

UILabel * mLabel = [[UILabel alloc]initWithFrame:CGRectMake(35, 30, 100, 100)];

mLabel.text = strTime;

mLabel.font = [UIFont systemFontOfSize:80];

mLabel.textColor = [UIColor redColor];

[timeView addSubview:mLabel];

UILabel * lLabel = [[UILabel alloc]initWithFrame:CGRectMake(55, 100, 60, 60)];

lLabel.text = @"分钟";

lLabel.textColor = [UIColor redColor];

lLabel.font = [UIFont systemFontOfSize:20];

[timeView addSubview:lLabel];

});

timeout--;

}

});

dispatch_resume(_timer);

#pragrm mark ---NSTimer---

  1. int secondsCountDown; //倒计时总时长
  2. NSTimer *countDownTimer;
  3. UILabel *labelText;
  1. //创建UILabel 添加到当前view
  2. labelText=[[UILabel alloc]initWithFrame:CGRectMake(10, 120, 120, 36)];
  3. [self.view addSubview:labelText];
  4. //设置倒计时总时长
  5. secondsCountDown = 60;//60秒倒计时
  6. //开始倒计时
  7. countDownTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timeFireMethod) userInfo:nil repeats:YES]; //启动倒计时后会每秒钟调用一次方法 timeFireMethod
  8. //设置倒计时显示的时间
  9. labelText.text=[NSString stringWithFormat:@"%d",secondsCountDown];
  1. -(void)timeFireMethod{
  2. //倒计时-1
  3. secondsCountDown--;
  4. //修改倒计时标签现实内容
  5. labelText.text=[NSString stringWithFormat:@"%d",secondsCountDown];
  6. //当倒计时到0时,做需要的操作,比如验证码过期不能提交
  7. if(secondsCountDown==0){
  8. [countDownTimer invalidate];
  9. [labelText removeFromSuperview];
  10. }
  11. }
时间: 2024-10-19 03:08:26

GCD 和Timer的相关文章

iOS开发总结(A0)- GCD

1. 基本概念 - 同步:执行完再返回 - 异步:直接返回 - 并行:queue中的任务可同时进行 - 串行:queue 中的任务按顺利进行(fifo) 2. 常用的几种queue a. main queue ,主线程,有关ui的操作在这个queue中进行,否则可能没有反应 dispatch_get_main_queue() b. global queue, 系统提供的并行queue dispatch_get_global_queue ( long identifier, unsigned lo

选择 GCD 还是 NSTimer ?

我们常常会延迟某件任务的执行,或者让某件任务周期性的执行.然后也会在某些时候需要取消掉之前延迟执行的任务. 延迟操作的方案一般有三种: 1.NSObject的方法: 2.使用NSTimer的方法: 3.使用GCD的方法: 一般情况下,我们选择使用GCD的dispatch_after. 因为如果不用GCD,编码需要注意以下三个细节: 1.必须保证有一个活跃的runloop. performSelector和scheduledTimerWithTimeInterval方法都是基于runloop的.我

GCD dispatch_source基本使用,创建GCD定时器与NSTimer的区别

可以使用GCD创建定时器 创建定时器: 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); self.timer = timer; // 定时任务调度设置,4秒后启动,每个5秒运行 dispat

【iOS程序启动与运转】- RunLoop个人小结

学习iOS开发一般都是从UI开始的,从只知道从IB拖控件,到知道怎么在方法里写代码,然后会显示什么样的视图,产生什么样的事件,等等.其实程序从启动开始,一直都是按照苹果封装好的代码运行着,暴露的一些属性和方法作为接口,是让我们在给定的方法里写代码实现自定义功能,做出各种各样的应用.这些方法的调用顺序最为关键,熟悉了程序运转和方法调用的顺序,才可以更好地操控程序和代码,尽量避免Xcode不报错又实现不了功能的BUG.从Xcode的线程函数调用栈可以看到一些方法调用顺序. 0 从程序启动开始到vie

IOS开发定时器延时的探究

在日常开发中,我们经常要延时等待(如网络请求,UI更新完)然后做一些事情,或者是做一些周期性的处理.这个时候就要求我们实现一个周期性的定时器进行延时操作.常用的延时实现方法有下面三种: 1.NStimer实现 不管是一次性的还是周期性的timer的实际触发事件的时间,都会与所加入的RunLoop和RunLoop Mode有关,如果此RunLoop正在执行一个连续性的运算,timer就会被延时触发.重复性的timer遇到这种情况,如果延迟超过了一个周期,则会在延时结束后立刻执行,并按照之前指定的周

[ios 程序启动与运转] - RunLoop个人小结

学习iOS开发一般都是从UI开始的,从只知道从IB拖控件,到知道怎么在方法里写代码,然后会显示什么样的视图,产生什么样的事件,等等.其实程序从启动开始,一直都是按照苹果封装好的代码运行着,暴露的一些属性和方法作为接口,是让我们在给定的方法里写代码实现自定义功能,做出各种各样的应用.这些方法的调用顺序最为关键,熟悉了程序运转和方法调用的顺序,才可以更好地操控程序和代码,尽量避免Xcode不报错又实现不了功能的BUG.从Xcode的线程函数调用栈可以看到一些方法调用顺序. --零--从程序启动开始到

[转]多线程

原文地址:http://d3caifu.com/ebook/MultiThread.html 随着计算机/移动设备不断发展,提供了越来越强大的计算能力和资源,从硬件层面来看首先是CPU的芯片集成度越来越高,提供更快的处理能力;其次是多核化多CPU发展;最后剥离一些图片动画渲染等到独立的协处理器处理,硬件的提升促进了操作系统软件OS的不断进化,更好的利用硬件能力和资源,提高系统的性能,多线程多任务处理就是最为关键的技术. 线程分为主线程和后台线程2种:一个应用只有唯一的一个主线程,其它线程都是后台

深入理解iOS开发之RunLoop

RunLoop属于iOS进阶开发中的一个重要技术点,本文会重点讲解我在开发过程中总结的对RunLoop的理解. RunLoop概念 RunLoop是与多线程相关的一个事件处理机制,用来调度操作和处理协调即将发生的事件.iOS Developer Library关于RunLoop的解释是,RunLoop机制的四个作用: RunLoop的管理并不是自动进行的,你需要编写线程代码去开始一个RunLoop,并在合适的时机响应事件.但是Cocoa和Core Foundation库都提供了RunLoop对象

【精】Runloop 深入浅出,综合解答

简单的说run loop是事件驱动的一个大循环,如下代码所示: int main(int argc, char * argv[]) { //程序一直运行状态 while (AppIsRunning) { //睡眠状态,等待唤醒事件 id whoWakesMe = SleepForWakingUp(); //得到唤醒事件 id event = GetEvent(whoWakesMe); //开始处理事件 HandleEvent(event); } return 0; } -------------