倒计时
- 倒计时60s
- 倒计时HH-MM-SS
1.倒计时60s
- (void)countDownTime{
__block NSInteger time = 59; //倒计时时间
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.0*NSEC_PER_SEC, 0); //每秒执行
dispatch_source_set_event_handler(timer, ^{
if(time <= 0){ //倒计时结束,关闭
dispatch_source_cancel(timer);
dispatch_async(dispatch_get_main_queue(), ^{
//设置按钮的样式
self.timeCountButton.enabled = YES;
[self.timeCountButton setTitle:@"重新发送" forState:UIControlStateNormal];
});
}else{
int seconds = time % 60;
dispatch_async(dispatch_get_main_queue(), ^{
//设置label读秒效果
self.timeCountButton.enabled = NO;
[self.timeCountButton setTitle:[NSString stringWithFormat:@"%.2d秒后再次获取",seconds] forState:UIControlStateDisabled];
});
time--;
}
});
dispatch_resume(timer);
}
很多时候在点击按钮发送短信的时候需要倒计时读秒
2.倒计时
- (void)activeCountDownActionWithtime:(NSString *)countTime{
_timer = nil;
#if 0
// 1.计算截止时间与当前时间差值
// 倒计时的时间 测试数据
NSString *deadlineStr = @"2019-08-19 12:00:00";
// 当前时间的时间戳
NSString *nowStr = [self getCurrentTimeyyyymmdd];
// 计算时间差值
NSInteger secondsCountDown = [self getDateDifferenceWithNowDateStr:nowStr deadlineStr:deadlineStr];
#endif
NSInteger secondsCountDown = [countTime integerValue];
if (secondsCountDown == 0) {
self.timeLabel.text = @"0天00:00:00";
_timer = nil;
return;
}
// 2.使用GCD来实现倒计时 用GCD这个写有一个好处,跳页不会清零 跳页清零会出现倒计时错误的
__weak __typeof(self) weakSelf = self;
if (_timer == nil) {
__block NSInteger timeout = secondsCountDown; // 倒计时时间
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(), ^{
weakSelf.timeLabel.text = @"0天00:00:00";
});
} else { // 倒计时重新计算 时/分/秒
NSInteger days = (int)(timeout/(3600*24));
NSInteger hours = (int)((timeout-days*24*3600)/3600);
NSInteger minute = (int)(timeout-days*24*3600-hours*3600)/60;
NSInteger second = timeout - days*24*3600 - hours*3600 - minute*60;
NSString *strTime = [NSString stringWithFormat:@"0天%02ld:%02ld:%02ld", hours, minute, second];
dispatch_async(dispatch_get_main_queue(), ^{
if (days == 0) {
weakSelf.timeLabel.text = strTime;
} else {
weakSelf.timeLabel.text = [NSString stringWithFormat:@"%ld天%02ld:%02ld:%02ld", days, hours, minute, second];
}
});
timeout--; // 递减 倒计时-1(总时间以秒来计算)
}
});
dispatch_resume(_timer);
}
}
}
/**
* 获取当天的字符串
*
* @return 格式为年-月-日 时分秒
*/
- (NSString *)getCurrentTimeyyyymmdd {
NSDate *now = [NSDate date];
NSDateFormatter *formatDay = [[NSDateFormatter alloc] init];
formatDay.dateFormat = @"yyyy-MM-dd HH:mm:ss";
NSString *dayStr = [formatDay stringFromDate:now];
return dayStr;
}
/**
* 获取时间差值 截止时间-当前时间
* nowDateStr : 当前时间
* deadlineStr : 截止时间
* @return 时间戳差值
*/
- (NSInteger)getDateDifferenceWithNowDateStr:(NSString*)nowDateStr deadlineStr:(NSString*)deadlineStr {
NSInteger timeDifference = 0;
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yy-MM-dd HH:mm:ss"];
NSDate *nowDate = [formatter dateFromString:nowDateStr];
NSDate *deadline = [formatter dateFromString:deadlineStr];
NSTimeInterval oldTime = [nowDate timeIntervalSince1970];
NSTimeInterval newTime = [deadline timeIntervalSince1970];
timeDifference = newTime - oldTime;
return timeDifference;
}
在
cell
中倒计时需要每次加载倒计时先移除倒计时,防止返回或者跳转到下一个界面倒计时还在运行,导致内存崩溃。但是如果在当前页刷新按钮状态比如订单详情,刷新当前页状态改变了,倒计时需要移除,用一下方法。
[_timer invalidate];
网友评论