0

と呼ばれるクラスがありますRunningInteger。これは、別のスレッドで (メイン スレッドをブロックしないようにするため)、1 から 60 までの整数 ivar を 1 秒間隔でループします。したがって、ループ全体に約 1 分かかります。ivar は、メソッドまたは読み取り専用プロパティを介して外部に提供されます。

NSViewそれ自体を表示できる 60 の異なるモードを持つカスタムサブクラスがあります。

今、これは私が達成したいことです:

  1. インターフェイスにボタンがあります。クリックすると、つまりそのアクション メソッド内で、 の新しいインスタンスRunningIntegerが作成され、ビューはこのインスタンスの ivar に従って描画されます。

  2. ただし、これが問題です。ボタンをもう一度クリックすると、それに応じてアニメーションがリセットされ、最初からやり直す必要があります。これはスレッド セーフである必要があり、メモリ リークはなく、スレッドがスタックすることもありません。

これを達成する方法についてのアイデアはありますか?

これと密接に関連する (おそらく他の多くの) 問題が 2 つあります。

  • 明らかに、スレッドが 60 秒後に消えることがわかっていても、スレッドをスタックし続けるのは良い設計ではありません。結局のところ、60 秒が 1 時間だったらどうでしょうか。(その可能性はあります。)

  • get の最近作成されたインスタンスのみがビューの表示を更新するようにするにはどうすればよいでしょうかRunningInteger(setNeedsDisplay:YES)。

4

1 に答える 1

1

RunningInteger をシングルトンにします。

+(RunningInteger *)sharedManager {
    static dispatch_once_t pred;
    static RunningInteger *shared = nil;

    dispatch_once(&pred, ^{
        shared = [[RunningInteger alloc] init];
    });
    return shared;
}

次に、ボタンがボタンを押したときにカウンターをリセットします。タイマーを使用して、一定の間隔でシングルトン カウンターを増やします。次に、ビューからシングルトンにアクセスして、何を表示するかを確認します。

于 2012-08-31T15:46:52.187 に答える