今天带来的是简单的倒计时功能的实现,由于默认的结束时间为24点,所以即使把这个程序从后台完全清除掉,在运行,看上去也想在继续倒计时一样,大家别被误导
//
// ViewController.m
// 倒计时
//
// Created by Amydom on 16/11/21.
// Copyright © 2016年 Amydom. All rights reserved.
//
#import "ViewController.h"
@interface ViewController (){
dispatch_source_t _timer;
}
@property (nonatomic , strong)UILabel * dayLabel;
@property (nonatomic , strong)UILabel * hourLabel;
@property (nonatomic , strong)UILabel * minuteLabel;
@property (nonatomic , strong)UILabel * secondLabel;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self initView];
[self getCountdown];
}
- (void)initView{
_dayLabel = [[UILabel alloc]initWithFrame:CGRectMake(50, 100, 50, 50)];
[self.view addSubview:_dayLabel];
_hourLabel = [[UILabel alloc]initWithFrame:CGRectMake(_dayLabel.frame.size.width + _dayLabel.frame.origin.x+ 10, 100, 50, 50)];
[self.view addSubview:_hourLabel];
_minuteLabel = [[UILabel alloc]initWithFrame:CGRectMake(_hourLabel.frame.size.width + _hourLabel.frame.origin.x+ 10, 100, 50, 50)];
[self.view addSubview:_minuteLabel];
_secondLabel = [[UILabel alloc]initWithFrame:CGRectMake(_minuteLabel.frame.size.width + _minuteLabel.frame.origin.x+ 10, 100, 50, 50)];
[self.view addSubview:_secondLabel];
}
- (void)getCountdown{
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
[dateFormatter setDateFormat:@"yyyy-MM-dd"];
//测试数据
NSDate *endDate = [dateFormatter dateFromString:[self getyyyymmdd]];
NSDate *endDate_tomorrow = [[NSDate alloc]initWithTimeIntervalSinceReferenceDate:([endDate timeIntervalSinceReferenceDate] + 24 * 3600)];
NSDate *startDate = [NSDate date];
NSTimeInterval timeInterval = [endDate_tomorrow timeIntervalSinceDate:startDate];
if (_timer == nil) {
__block int timeout = timeInterval; //倒计时时间
if (timeout != 0) {
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
_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);
_timer = nil;
dispatch_async(dispatch_get_main_queue(), ^{//回到主线程,修改lableText
//这里也可以处理倒计时结束后的一些逻辑
_dayLabel.text = @"";
_hourLabel.text = @"00";
_minuteLabel.text = @"00";
_secondLabel.text = @"00";
});
}else{
int days = (int)(timeout / (3600 * 24));
if (days == 0) {
_dayLabel.text = @"";
}
int hours = (int)((timeout-days*24*3600)/3600);
int minute = (int)(timeout-days*24*3600-hours*3600)/60;
int second = timeout-days*24*3600-hours*3600-minute*60;
dispatch_async(dispatch_get_main_queue(), ^{
if (days == 0) {
self.dayLabel.text = @"0天";
}else{
self.dayLabel.text = [NSString stringWithFormat:@"%d天",days];
}
if (hours<10) {
self.hourLabel.text = [NSString stringWithFormat:@"0%d",hours];
}else{
self.hourLabel.text = [NSString stringWithFormat:@"%d",hours];
}
if (minute<10) {
self.minuteLabel.text = [NSString stringWithFormat:@"0%d",minute];
}else{
self.minuteLabel.text = [NSString stringWithFormat:@"%d",minute];
}
if (second<10) {
self.secondLabel.text = [NSString stringWithFormat:@"0%d",second];
}else{
self.secondLabel.text = [NSString stringWithFormat:@"%d",second];
}
});
timeout--;
}
});
dispatch_resume(_timer);
}
}
}
/**
* 获取当天的年月日的字符串
* 这里测试用
* @return 格式为年-月-日
*/
- (NSString *)getyyyymmdd{
NSDate *now = [NSDate date];
NSDateFormatter *formatDay = [[NSDateFormatter alloc]init];
formatDay.dateFormat = @"yyyy-MM-dd";
NSString *dayStr = [formatDay stringFromDate:now];
return dayStr;
//把数字转化成时间如下:
// NSString*time = @"1329038338";
//
// NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
// [formatter setDateStyle:NSDateFormatterMediumStyle];
// [formatter setTimeStyle:NSDateFormatterShortStyle];
// [formatter setDateFormat:@"YYYY-MM-dd HH:mm"];
// NSDate*confromTimesp = [NSDate dateWithTimeIntervalSince1970:(NSTimeInterval)[time intValue]];
// NSString*confromTimespStr = [formatter stringFromDate:confromTimesp];
// dayStr = confromTimespStr;
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end