我做了一个名为Timer的课程。其指定的初始化程序启动一个定时器,其值为秒。它很棒。但是我无法通过计时器滴答来更新控制器。
现在,对于每个tick,我发送一个带有userInfo的NSNotificationCenter,这是一个带有当前时间的简单字典,这听起来不是最好的方法......
NSDictionary *dict = [NSDictionary dictionaryWithObject:[NSNumber numberWithFloat:self.timerCount] forKey:@"timerCount"];
[[NSNotificationCenter defaultCenter] postNotificationName:@"TimerCountChanged"
object:self
userInfo:dict];
我应该使用其他技术还是以正确的方式进行?
提前谢谢!
修改 我需要使用不同的值初始化不同的计时器。我尝试使用Delegates,但我的控制器中只有一个方法来更新所有这些Timers的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个定时器,用户可以随时启动它们。它们也可以有不同的时间,也由用户定义。
答案 0 :(得分:2)
发送通知很好,但您可能无法定期观察。
有时会延迟,你可能会在不规则的时间间隔内观察它们。
您可以使用
委托模式。
按selector
编辑:
来自
Apple documentation on Performance CodeSpeed on Notifications
您发送的通知越少,对您的通知的影响就越小 应用程序的性能。取决于实施,成本 发送单个通知可能会非常高。例如,在 核心基础和Cocoa通知的情况,代码 发布通知必须等到所有观察者完成处理 通知。如果有很多观察者,或者每个人都表现出来 大量的工作,延迟可能很大。
答案 1 :(得分:0)
如果每个Timer
实例只有一个客户端对象,则应使用delegate
模式。您可以使用TimerDelegate
对象可以在计时器滴答时调用的方法定义Timer
协议。
e.g。
@class Timer;
@protocol TimerDelegate
- (void) timer:(Timer *)timer didTriggerAt:(NSTimeInterval)time;
@end
@interface Timer
...
@property (assign) id<TimerDelegate> delegate;
...
@end
如果每次Timer
实例确实需要多个侦听器,那么NSNotificationCenter
方法会更合适。我可能会在名为userInfo
的{{1}}上公开@property
,而不是在Timer
字典中传递信息,这样当客户端对象收到通知时,他们可以简单地访问通知currentTime
上的currentTime
,而不是(IMO笨拙地)从Timer
读取数据。