1

我创建了一个带有公共 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,但这似乎效率低下并且容易有点不准确。

谢谢!

4

1 回答 1

0

使用模型中的计时器如何持续刷新 UI 元素?

将计时器移出模型。严重地。

您将遇到的每个 MVC 图形表示在 View 层和 Model 层之间都有一条很好的实线,这是有原因的。如果模型对视图了解太多,那么您的应用程序就会变得过度数据驱动和臃肿。反之亦然。将计时器插入控制器,并将更新从控制器路由到模型,以防止任何责任泄漏到应用程序的错误部分。

于 2013-08-17T18:38:34.017 回答