1

NSTimerの関数を使用してタイマーをviewWillAppear次のようにスケジュールします。

minutesTimer = nil;
minutesTimer = [NSTimer scheduledTimerWithTimeInterval:60 target:self selector:@selector(updateScrollViewItems) userInfo:NULL repeats:YES];

この関数呼び出しでは、updateScrollViewItems毎分セレクターを呼び出すことを期待していますが、そうではなく、予想よりも速く(数秒程度)アイテムを更新します。

この予期しない動作の原因は何ですか?

4

3 に答える 3

5

表示されている問題の直接の原因ではないかもしれませんが、既に 1 つの大きなエラーを特定できます。

このタイマーが毎回設定されるviewWillAppearということは、ビューが表示されるたびに、作成後 60 秒で起動する新しいタイマーを作成する (そして古いタイマーをリークする) ことを意味します。

ビューが何度も消えて再表示される場合、複数のタイマーがすべて完全にランダムな間隔で同じメソッドを起動することになります。

タイマーを適切に管理する必要があります。ビューが最初に作成されたときに開始し、ビューが表示されていないときでもカチカチ/起動し続けるようにする場合は、 または の間に作成しinit、 またはviewDidLoadのときに必ず停止する必要がありdeallocますviewDidUnload

ビューが現在のビューである場合にのみタイマーを作動させたい場合は、 と でタイマーの停止と開始を適切に管理していることを確認する必要がありviewDidAppearますviewWillDisappear

また、Williham Totland が回答で述べたように、正確なタイミングを NSTimer に頼るべきではありません。これは、ドキュメントにも記載されています。

タイマーはリアルタイムのメカニズムではありません。タイマーが追加された実行ループ モードの 1 つが実行中で、タイマーの起動時間が経過したかどうかを確認できる場合にのみ起動します。典型的な実行ループが管理するさまざまな入力ソースのため、タイマーの時間間隔の有効な分解能は 50 ~ 100 ミリ秒程度に制限されます。実行ループがタイマーを監視していないモードにあるとき、または長いコールアウト中にタイマーの起動時間が発生した場合、実行ループが次にタイマーをチェックするまで、タイマーは起動しません。したがって、タイマーが潜在的に起動する実際の時間は、スケジュールされた起動時間よりもかなりの時間になる可能性があります。

この場合、タイム スパンが 60 秒であるため、タイマーが正確でなくても問題はありません。タイマーが適切に管理されていないことが原因だと思います。

于 2010-03-15T11:37:59.903 に答える
0

ビューが現在のビューである場合にのみタイマーを作動させたい場合は、viewDidAppear と viewWillDisappear でタイマーの停止と開始を適切に管理していることを確認する必要があります。

この情報をありがとう、私はこのスレッドの OP ではありませんが、同様の問題に対する回答を探していました。私は数日間頭をかきむしり、インターネット中を検索しましたが、答えが見つかりませんでした. 最後にこのスレッドを見つけました。これは私にとって貴重な情報です。

于 2010-12-13T05:05:28.557 に答える
0

iPhone にはたくさんの機能があります。ただし、きちんとしたデバイスです。他のコンピューターと同じように、正確な時計ではありません。ただし、問題のメソッドが double である NSTimeInterval を取るように見えます。に変更することをお勧めし60.0ます。

于 2010-03-15T11:28:46.243 に答える