自己稍微记录一下,方便以后用到:
先创建一个定时器的类:
#import "TimeCenter.h"
@interface TimeCenter ()
@property (nonatomic, assign) NSInteger timeInterval;// 累计时间
@property (nonatomic, strong) NSTimer *timer; @end
@implementation TimeCenter
+ (instancetype)shareCenter {
static TimeCenter *instance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[TimeCenter alloc]init];
}); return center;
}
//启动
- (void)start {
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(timerEvent) userInfo:nil repeats:YES];
self.timer=timer;
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
}
//停止
- (void)stop
{
if (_timer != nil) {
[self.timer invalidate];
}
} //事件
- (void)timerEvent
{
if (_timer != nil) {
self.timeInterval++;
}
}
在控制器创建的时候开始定时器,
然后在cell中添加kvo 监听事件:
@implementation TableViewCell
+ (instancetype)cellWithTableView:(UITableView *)tableView{
static NSString *ID = @"tableViewCell";
TableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
if (cell == nil) {
cell = [[TableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];
}
return cell;
} - (id)initWithStyle:(UITableViewCellStyle)style
reuseIdentifier:(NSString *)reuseIdentifier{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
//第二种:KVO监听
[[TimeCenter shareCenter] addObserver:self
forKeyPath:@"timeInterval"
options:NSKeyValueObservingOptionOld
|NSKeyValueObservingOptionNew
context:nil];
}
return self;
} - (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context{
if ([keyPath isEqual:@"timeInterval"]) {
[self reloadCell];
}
} - (void)setTimeModel:(TimeModel *)timeModel{
_timeModel=timeModel;
[self reloadCell];
} - (void)reloadCell{
NSDate *date = [NSDate dateWithTimeIntervalSinceNow:0];
NSInteger time = [date timeIntervalSince1970];
NSInteger leftTime = [self.timeModel.time integerValue] - time;
if (leftTime <0){
self.textLabel.text =@"已结束";
}else{
self.textLabel.text = [NSString stringWithFormat:@"剩余%ld天%02ld:%02ld:%02ld", leftTime/(60*60*24),
(leftTime/3600)%24,
(leftTime/60)%60,
leftTime%60];
}
}
- (void)dealloc
{
[[TimeCenter shareCenter] removeObserver:self
forKeyPath:@"timeInterval"];