2013-03-02 75 views
0

我做了一個類,名爲Timer。其指定的初始化程序以秒爲單位啓動一個定時器。它效果很好。但是我在更新控制器時遇到了計時器滴答問題。從iOS發送模型到控制器的通知

現在,每一個節拍,我發送NSNotificationCenter與USERINFO這是一個簡單的字典,當前時間,這聽起來不是做的最好方法......

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

我應該正在使用其他技術,還是我正確地使用它?

預先感謝您!

編輯: 我需要初始化不同的定時器,使用不同的值。我試圖使用委託,但我只有一個方法在我的控制器中更新所有這些定時器的用戶界面! 如果我做這樣的事情會不會很糟糕?將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個定時器,用戶可以隨時啓動它們。他們也可以有不同的時間,這也是由用戶定義的。

+1

這是一個很好的第一步。現在你需要使用NSNotificationCenter的addObserver:selector:name:object – 2013-03-02 03:49:03

+0

來觀察這個通知是的,我只是不知道使用NSNotificationCenter是否是最好的方法 – Marcelo 2013-03-02 04:14:32

+0

一般來說,'NSNotificationCenter'是一個很好的在整個應用程序中傳遞消息的方式,而不會創建許多依賴項在這種情況下,我也建議你看看協議,正如答案中所建議的那樣。你能用你到底想要做什麼來更新這個問題嗎?也許有比創建多個定時器更好的解決方案。 – Pascal 2013-03-02 04:57:41

回答

2

發送通知很好,但您可能無法在常規時間觀察它。

有時會延遲,您可能會在不規則的時間間隔內觀察它們。

您可以使用

  1. 代理模式。通過selector

編輯

  • 調用方法:

    Apple documentation on Performance CodeSpeed on Notifications

    您發送的通知越少,對您的應用程序性能的影響就越小。取決於實施情況,發送單個通知的成本 可能非常高。例如,在 Core Foundation和Cocoa通知的情況下, 發佈通知的代碼必須等到所有觀察者完成處理 通知爲止。如果有許多觀察員,或者每個人都執行大量的工作,則延遲可能很大。

  • +2

    我爲另一篇關於設置代表的帖子寫了一篇相當長的答案。隨時檢查它,如果它是有幫助的:http://stackoverflow.com/questions/10272843/back-button-in-iphone-app/10273551#10273551 – JiuJitsuCoder 2013-03-02 03:54:33

    +0

    我與代表的問題是,我正在初始化不同的計時器在不同的時間,但我只會在我的控制器中有一個事件來更新我的用戶界面。 – Marcelo 2013-03-02 04:47:37

    +2

    你確定'NSNotification'延遲嗎?我非常頻繁地使用通知,從來沒有看到這個問題,通知甚至在同一個運行循環中交付。 – Pascal 2013-03-02 04:54:17

    0

    如果每個Timer實例只有一個客戶端對象,則應使用delegate模式。您可以使用Timer對象可以在計時器滴答時調用的方法來定義​​協議。

    例如

    @class Timer; 
    
    @protocol TimerDelegate 
    - (void) timer:(Timer *)timer didTriggerAt:(NSTimeInterval)time; 
    @end 
    
    @interface Timer 
    ... 
    @property (assign) id<TimerDelegate> delegate; 
    ... 
    @end 
    

    如果您確實需要多個聽衆每一個Timer實例蜱時間,那麼NSNotificationCenter方法將是更好的選擇。我可能會在userInfo字典中傳遞信息Timer中的一個@property,稱爲currentTime,這樣當客戶端對象獲得通知時,他們可以簡單地在通知Timer上訪問currentTime,而不是(IMO clunkily)讀取數據userInfo