在iOS中从模型向控制器发送通知

时间:2013-03-02 03:45:21

标签: ios objective-c model-view-controller notifications

我做了一个名为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个定时器,用户可以随时启动它们。它们也可以有不同的时间,也由用户定义。

2 个答案:

答案 0 :(得分:2)

发送通知很好,但您可能无法定期观察。

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

您可以使用

  1. 委托模式。

  2. selector

  3. 调用方法

    编辑:

    来自

    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读取数据。