0

タイマーというクラスを作りました。指定された初期化子は、秒単位の値でタイマーを開始します。それは素晴らしい働きをします。しかし、タイマーが刻々と過ぎてコントローラーを更新するのに問題があります。

現在、ティックごとに、現在の時刻を含む単純な辞書であるuserInfoを含むNSNotificationCenterを送信していますが、これは最善の方法ではありません...

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

他のテクニックを使用する必要がありますか、それとも正しい方法で実行していますか?

前もって感謝します!

編集: 異なる値を使用して、異なるタイマーを初期化する必要があります。デリゲートを使用しようとしましたが、コントローラーには、これらすべてのタイマーのUIを更新するためのメソッドが1つしかありませんでした。こんなことをしたら悪いのでしょうか?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

編集:

から

通知のパフォーマンスCodeSpeedに関するAppleのドキュメント

送信する通知が少な​​いほど、アプリケーションのパフォーマンスへの影響は小さくなります。実装によっては、単一の通知をディスパッチするためのコストが非常に高くなる可能性があります。たとえば、Core FoundationとCocoaの通知の場合、通知を投稿するコードは、すべてのオブザーバーが通知の処理を完了するまで待機する必要があります。オブザーバーが多数いる場合、またはそれぞれがかなりの量の作業を実行する場合、遅延が大きくなる可能性があります。

于 2013-03-02T03:51:34.493 に答える
0

Timerインスタンスごとにクライアントオブジェクトが1つしかない場合は、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を公開するので、クライアントオブジェクトが通知を受け取ったときに、(IMOが不器用に)からデータを読み取る代わりに、通知にcurrentTimeアクセスするだけで済みます。currentTimeTimeruserInfo

于 2013-03-02T03:48:59.987 に答える