私はやや複雑な 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」を含む解決策があると思いますが、どちらかが呼び出されない状況に陥ることを恐れています。また、誤った仮定を行って複数のループを生成したくありません。