我创建了一个带有公共 API 的自定义计时器类,允许访问属性 timeLeft,并允许调用类启动和暂停计时器,以及布尔 isTimerPaused。
我需要初始化和启动计时器,并在我的游戏循环中暂停以应对各种情况。所以我已经开始在我的游戏(模型)中初始化我的计时器,如下所示:
#define timerDuration 10
self.timer =[[Timer alloc] initWithTimerDurationInSeconds:timerDuration];
下面是我的 Timer API:
@interface Timer : NSObject
-(id)initWithTimerDurationInSeconds:(NSTimeInterval)duration;
-(void)startTimer;
-(void)pauseTimer;
@property (nonatomic, getter = isTimerPaused)BOOL timerPaused;
@property (nonatomic)NSTimeInterval timeLeft;
@end
和我的计时器实现
#import "Timer.h"
@interface Timer ()
@property (nonatomic)NSTimeInterval timeRemaining;
@property (nonatomic)NSTimeInterval duration;
@property (strong, nonatomic) NSTimer *timer;
@property (strong, nonatomic)NSDate *targetTime;
@end
@implementation Timer
-(id)initWithTimerDurationInSeconds:(NSTimeInterval)duration
{
self = [super init];
if (self)
{
if (duration) _duration = duration;
else NSLog(@"Must Initialize Timer With Duration");
}
return self;
}
-(void)startTimer
{
self.targetTime = [NSDate dateWithTimeIntervalSinceNow:self.duration];
self.timer = [NSTimer scheduledTimerWithTimeInterval:.05 target:self selector:@selector(updateTimerLabel) userInfo:nil repeats:YES];
self.timerPaused = NO;
}
-(void)pauseTimer
{
self.timerPaused = !self.isTimerPaused;
if (self.isTimerPaused)
{
self.timeRemaining = [self.targetTime timeIntervalSinceNow];
[self.timer invalidate];
self.timer = nil;
}
else
{
self.targetTime = [NSDate dateWithTimeIntervalSinceNow:self.timeRemaining];
self.timer = [NSTimer scheduledTimerWithTimeInterval:.05 target:self selector:@selector(updateTimerLabel) userInfo:nil repeats:YES];
}
}
-(void)updateTimeLeft
{
self.timeLeft = [self.targetTime timeIntervalSinceNow];
if (self.timeLeft <=0)
{
[self.timer invalidate];
ago", -timeLeft];
}
}
@end
这一切在理论上都会很好用,因为我可以在我的游戏循环中根据需要启动和停止我的计时器,并且我可以访问剩余的时间来从我的控制器更新我的计时器 UILabel。
我的问题是,如果计时器在我的控制器中,我可以简单地更新 updateTimeLeft 方法内的标签。使用模型中的计时器如何持续刷新 UI 元素。我的想法是在我的控制器中有某种连续的计时器,它会使用计时器的 timeLeft 属性更新 UILabel,但这似乎效率低下并且容易有点不准确。
谢谢!