iPhone アプリに timer1 と timer2 という 2 つの NSTimer がある とします。 timer1はfunction1を毎秒 30 回呼び出し、timer2はfunction2を毎秒 30 回呼び出します。これら 2 つの関数が同じ整数変数の読み取りと更新を行っているとします。ここに「マルチスレッド」の問題はありますか? そうでない場合、iPhone OS は 2 つの関数の実行を (一般的に) どのように処理しますか?
2 に答える
すべての iPhone アプリケーション (およびその他のプラットフォーム) の中核は実行ループです。各スレッドには実行ループがあり、メイン スレッドの実行ループは自動的に設定されます。NSTimer を起動したり、ビュー階層を描画したりするなど、何かする必要がある場合、実行ループがそれらのタスクを実行します。何もすることがない場合、実行ループはアイドル状態になり、他の処理が可能になります。
実行ループの内部はスレッド対応であるため、実行ループによって処理されるものは何もありません。すべての NSTimer コールバックとビューのレンダリングは、シリアルまたはリニア フローの単一スレッドで発生します。
具体的な詳細については、NSRunLoop または CFRunLoop を検索できます。
私の知る限り、NSTimers は実行ループを使用して「非同期性」を実現しています。タイマーがscheduledTimerWith...メソッドを使用して作成された場合、デフォルト(メイン)の実行ループでスケジュールされ、メインスレッドで実行されます。
タイマー用の新しいスレッドは作成されないと思います(明示的に作成し、タイマーをその実行ループに割り当てない限り)。
結局のところ、2 つのタイマーが競合するべきではないと思います。
ただし、ドキュメントには、タイマーはリアルタイムを表していないと記載されています。タイマーはスケジュールされた時刻以降に起動しますが、スケジュールされた時刻に正確に起動することは保証されていません。したがって、起動されたメソッドの実行にタイマーの間隔よりも長い時間がかかる場合、メソッドが期待どおりに頻繁に呼び出されないことがあります。
そうは言っても、あなたが質問している特定の理由はありますか?この設定を使用して望ましくない動作が見られますか?