为NSTimer增加价值的可行性

时间:2012-10-18 15:57:13

标签: objective-c nstimer

我目前正在使用NSTimer作为记录时间的基础。但是,如果玩家在当前问题上使用了提示或没收,我希望对正在进行的NSTimer增加时间进行处罚。

我的问题是,是否有可能为正在进行的NSTimer增加更多价值? 例如,计时器为0:23:41.2,用户按提示/罚款。我想要一个添加的功能,比方说10分钟。当玩家按提示/没收时,如何制作一个定时器将变为0:33:41.2的功能?

我尝试在谷歌和SO上找到与NSTimer相关的文章,并遇到了这个可能有用的SO线程。 How to value for NSTimer

而不是线程中显示的经过时间,我想我可以用下面的变量交换它。 (但如果我在下面显示的例子不可行,请赐教。我真的想让这个游戏成功一个)

-(BOOL)hintButtonPressed

-(void) timerFireMethod:(NSTimer *) theTimer {

        if (hintButtonPressed == true) {
            // do something to increase value
            [theTimer invalidate];
        } 
}

3 个答案:

答案 0 :(得分:2)

NSTimer不是跟踪时间的好工具。它是安排定期操作的好工具(特别是没有非常严格的时序要求的操作)。

跟踪时间的方式是三个ivars:最近的“计时器开始”时间,“累计时间”(最近一次开始之前的时间)和“isRunning”布尔值。在任何给定时间,总时间为:

accumulated + (now - start) * (isRunning ? 1 : 0)

通过此操作,您可以通过修改accumulated轻松添加或减少时间。并且您不需要NSTimer来更新您的数据(这很少是一种好方法)。

答案 1 :(得分:2)

即使我不会使用NSTimer进行倒计时,也可以通过简单的方法为其fireDate添加时间:

[_timer setFireDate:[[_timer fireDate] dateByAddingTimeInterval:600]];

这会给我的_timer增加10分钟(600秒)。

对于您的示例,最好的解决方案是为按钮创建一个操作方法,并检查该操作方法是否已经获得了时间奖励。

当然你可以在fire方法中修改fireDate,但是我的代码行不会再次触发它。

答案 2 :(得分:1)

根据我的记忆,你无法添加,增加NSTimer的时间,你需要创建一个新的,并释放/使旧的无效。

顺便说一句,如果它是一个简单的计时器,你仍然可以轻松实现

[NSObject cancelPreviousPerformRequestsWithTarget: self]
[self performSelector:<#(SEL)#> withObject:<#(id)#> afterDelay: incrementedTime];

但是如果你执行选择器,你无法获得像NSTimer这样的精确时间信息,你可以盲目增加时间。所有这些都取决于您的需求。