参考
使用的是第三方: OYCountDownManager
详细看了这个工具类,运用的是时间差的方法实现倒计时的功能。
比如说我们从后台请求到的时间是500秒的时间段,那么工具类里面的timeInterval会从0开始每秒增加,然后用500-timeInterval,达到倒计时显示的功能。
页面的刷新,将timeInterval置为0.因为刷新页面相当于重新请求数据,比如说第二次请求数据此时为350秒,将timeInterval置为0之后,就是350-0,达到页面刷新的效果。
大神写的挺好的。
#import "OYSingleTableVC.h"
#import "OYModel.h"
#import "OYTableViewCell.h"
#import "OYCountDownManager.h"
@interface OYSingleTableVC ()<UITableViewDataSource, UITableViewDelegate>
@property (nonatomic, strong) UITableView *tableView;
@property (nonatomic, strong) NSArray *dataSource;
@end
@implementation OYSingleTableVC
- (void)viewDidLoad {
[super viewDidLoad];
self.title = @"单个列表倒计时";
self.view.backgroundColor = [UIColor whiteColor];
[self.view addSubview:self.tableView];
// 启动倒计时管理
[kCountDownManager start];
}
#pragma mark - UITableViewDataSource, UITableViewDelegate
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return self.dataSource.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
OYTableViewCell *cell = (OYTableViewCell *)[tableView dequeueReusableCellWithIdentifier:OYTableViewCellID];
// 传递模型
OYModel *model = self.dataSource[indexPath.row];
cell.model = model;
[cell setCountDownZero:^(OYModel *timeOutModel){
// 回调
if (!timeOutModel.timeOut) {
NSLog(@"SingleTableVC--%@--时间到了", timeOutModel.title);
}
// 标志
timeOutModel.timeOut = YES;
}];
return cell;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return 50;
}
#pragma mark - 刷新数据
- (void)reloadData {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
// 模拟网络请求
self.dataSource = nil;
// 调用reload
[kCountDownManager reload];
// 刷新
[self.tableView reloadData];
// 停止刷新
[self.tableView.refreshControl endRefreshing];
});
}
#pragma mark - Getter
- (UITableView *)tableView {
if (!_tableView) {
_tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
_tableView.dataSource = self;
_tableView.delegate = self;
_tableView.refreshControl = [[UIRefreshControl alloc] init];
[_tableView.refreshControl addTarget:self action:@selector(reloadData) forControlEvents:UIControlEventValueChanged];
[_tableView registerClass:NSClassFromString(OYTableViewCellID) forCellReuseIdentifier:OYTableViewCellID];
}
return _tableView;
}
- (NSArray *)dataSource {
if (_dataSource == nil) {
NSMutableArray *arrM = [NSMutableArray array];
for (NSInteger i=0; i<50; i++) {
// 模拟从服务器取得数据 -- 例如:服务器返回的数据为剩余时间数
NSInteger count = arc4random_uniform(100); //生成0-100之间的随机正整数
OYModel *model = [[OYModel alloc]init];
model.count = count;
model.title = [NSString stringWithFormat:@"第%zd条数据", i];
[arrM addObject:model];
}
_dataSource = arrM.copy;
}
return _dataSource;
}
- (void)dealloc {
// 废除定时器
[kCountDownManager invalidate];
// 清空时间差
[kCountDownManager reload];
}
@end
//
// TableViewCell.m
// CellCountDown
//
// Created by herobin on 16/9/11.
// Copyright © 2016年 herobin. All rights reserved.
//
#import "OYTableViewCell.h"
#import "OYCountDownManager.h"
#import "OYModel.h"
NSString *const OYTableViewCellID = @"OYTableViewCell";
@interface OYTableViewCell ()
@end
@implementation OYTableViewCell
// 代码创建
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
if (self = [super initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:reuseIdentifier]) {
// 监听通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(countDownNotification) name:OYCountDownNotification object:nil];
}
return self;
}
// xib创建
- (instancetype)initWithCoder:(NSCoder *)coder
{
self = [super initWithCoder:coder];
if (self) {
// 监听通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(countDownNotification) name:OYCountDownNotification object:nil];
}
return self;
}
#pragma mark - 倒计时通知回调
- (void)countDownNotification {
/// 判断是否需要倒计时 -- 可能有的cell不需要倒计时,根据真实需求来进行判断
if (0) {
return;
}
/// 计算倒计时
OYModel *model = self.model;
NSInteger timeInterval;
if (model.countDownSource) {
timeInterval = [kCountDownManager timeIntervalWithIdentifier:model.countDownSource];
}else {
timeInterval = kCountDownManager.timeInterval;
NSLog(@"fengfeng---%ld",kCountDownManager.timeInterval);
}
NSInteger countDown = model.count - timeInterval;
/// 当倒计时到了进行回调
if (countDown <= 0) {
self.detailTextLabel.text = @"活动开始";
// 回调给控制器
if (self.countDownZero) {
self.countDownZero(model);
}
return;
}
/// 重新赋值
self.detailTextLabel.text = [NSString stringWithFormat:@"倒计时%02zd:%02zd:%02zd", countDown/3600, (countDown/60)%60, countDown%60];
}
/// 重写setter方法
- (void)setModel:(OYModel *)model {
_model = model;
self.textLabel.text = model.title;
// 手动刷新数据
[self countDownNotification];
}
- (void)dealloc {
[[NSNotificationCenter defaultCenter]removeObserver:self];
}
@end
在这里记录下。
OYCountDownManager下载地址