0

我做了一个类,叫做 Timer。其指定的初始化程序启动一个计时器,其值以秒为单位。它工作得很好。但是,我无法更新控制器 w/e 计时器滴答声。

现在,对于每个滴答声,我都会发送一个带有 userInfo 的 NSNotificationCenter ,这是一个带有当前时间的简单字典,这听起来不是最好的方法......

NSDictionary *dict = [NSDictionary dictionaryWithObject:[NSNumber numberWithFloat:self.timerCount] forKey:@"timerCount"];
[[NSNotificationCenter defaultCenter] postNotificationName:@"TimerCountChanged"
                                                    object:self
                                                  userInfo:dict];

我应该使用其他技术还是以正确的方式使用?

先感谢您!

编辑: 我需要使用不同的值初始化不同的定时器。我尝试使用 Delegates,但我的控制器中只有一种方法可以更新所有计时器的 UI!如果我做类似的事情会很糟糕吗?将 UIButton 传递给我的模型似乎也不是最好的解决方案,但它确实有效。

-(void)timer:(Timer *)timer didTriggerAt:(NSTimeInterval)time andButton:(UIButton *)button
{
        [button setTitle:[NSString stringWithFormat:@"%.0f", time] forState:UIControlStateNormal];
}

- (IBAction)startCountDown:(UIButton *)sender
{    
    self.timer1 = [[Timer alloc] initWithTimeInSeconds:10 andButton:sender];
    self.timer1.delegate = self;
}

我的 MainView 中有 3 个计时器,用户可以随时启动它们。它们也可以有不同的时间,这也是由用户定义的。

4

2 回答 2

2

发送通知很好,但您可能不会像常规时间那样观察它。

有时它会延迟,您可能会在不规则的时间间隔内观察它们。

您可以使用

  1. 委托模式。

  2. 调用方法selector

编辑:

Apple 关于通知性能代码速度的文档

您发送的通知越少,对应用程序性能的影响就越小。根据实现,发送单个通知的成本可能非常高。例如,在 Core Foundation 和 Cocoa 通知的情况下,发布通知的代码必须等到所有观察者完成对通知的处理。如果有许多观察者,或者每个人都执行大量工作,则延迟可能会很大。

于 2013-03-02T03:51:34.493 回答
0

如果每个Timer实例只有一个客户端对象,那么您应该使用该delegate模式。您将定义一个TimerDelegate协议,其中包含一个Timer对象可以在计时器滴答时调用的方法。

例如

@class Timer;

@protocol TimerDelegate
- (void) timer:(Timer *)timer didTriggerAt:(NSTimeInterval)time;
@end

@interface Timer
...
@property (assign) id<TimerDelegate> delegate;
...
@end

如果每次Timer实例滴答时确实需要多个侦听器,那么该NSNotificationCenter方法将更合适。userInfo我可能不会在字典中传递信息,而是公开一个@propertyon Timercalled currentTime,这样当客户端对象收到通知时,他们可以简单地访问currentTime通知Timer,而不是(IMO 笨拙地)从userInfo.

于 2013-03-02T03:48:59.987 回答