0

私はやや複雑な iOS ユーザー インターフェイスを持っています。UICollectionView の特定のセルを毎秒リロードして時間を表示する必要があります (複雑なストップウォッチのようなものです)。また、この呼び出しで毎秒いくつかのことを行う必要があります。 .

質問のパート 1


私の質問は、この種の問題を解決するためのベスト プラクティスは何ですか?

オプション 1 (再帰呼び出しを使用)

- (void)viewDidLoad
{
   [self runUpdateDisplayLoop];
}
- (void)runUpdateDisplayLoop
{
   //do stuff (reload cell, etc)
       
   //Recurissively Call Every Second
    dispatch_async(dispatch_get_main_queue(), ^{
        
        [self performSelector:@selector(runUpdateDisplayLoop) withObject:nil afterDelay:1.0];
        
    });
}

オプション 2 (NSTimer を使用)

- (void)viewDidLoad
{
   NSTimer *updateDisplayTimer = [NSTimer scheduledTimerWithTimeInterval:1.0
                                              target:self 
                                            selector:@selector(runUpdateDisplayLoop:) 
                                            userInfo:nil 
                                             repeats:YES];
}

- (void)updateDisplayLoop:(NSTimer *) theTimer
{
 //do stuff (reload cell, etc)
}

質問のパート 2


どちらの場合でも、これらのループを開始および終了するのに最適な場所はどこですか?

それらをViewDidLoadに入れると、関連するビューから離れたときでも呼び出され続けます。必要なときにのみループを実行したいと思います。一方、ビューが表示されるたびにループを実行する必要があります (ビューがさまざまな方法で閉じられた場合でも - アプリを閉じて再度開いた場合、通話が中断された場合など)。アプリのライフサイクルに関しては、iOS 5 と iOS 6 をターゲットにしています。

「viewWillAppear」と「viewWillDisappear」を含む解決策があると思いますが、どちらかが呼び出されない状況に陥ることを恐れています。また、誤った仮定を行って複数のループを生成したくありません。

4

2 に答える 2

1

パート 1の場合

タイマーの使用をお勧めします。主な理由は、タイマーを無効にしてプロセスを停止できるようにするためです。performSelector を使用すると、同様のことを実現できますが、私はその方法には行きません。それぞれ独自に。

パート 2の場合

viewWillAppear(またはviewDidAppear) とviewDidDisappear(または)を使用しますviewWillDisappear。表示時にタイマーをセットアップし、消えるときにそれを取り壊します。

RespondingtoDisplay-Notifications を確認してください

それが物事に光を当て、あなたの「しかし、どちらかが呼び出されない状況に陥ることを恐れています」に対処することを願っています。懸念

于 2013-06-28T18:22:41.887 に答える