iPhoneでソケット通信を学んでいるのですが、そのガイドに何か書いてCFRunloopありました(のガイドですCFNetwork、iOSで使えますか?) iOSのrunloopはどこで学べますか?
3 に答える
Apple のThreading Programming Guideの「Run Loops」の章を見てください。簡単に言えば:
- 各スレッドに関連付けられた実行ループが 1 つあります。
- 何かを行うには、実行ループを実行する必要があります。Apple のアプリケーションの main 関数が、メイン スレッドでこれを処理します。
- 実行ループは特定のモードで実行されます。「共通モード」は実際にはモードのセットであり、そのセットにモードを追加するための API があります。
- 実行ループの主な目的は、タイマーを監視し、ループ ソースを実行することです。各ソースは、特定のモードの特定の実行ループに登録され、実行ループがそのモードで実行されている適切なタイミングでのみチェックされます。
- 実行ループは、タイマーのチェックや他のイベント ソースのチェックなど、ループを一周するたびにいくつかの段階を通過します。いずれかのソースが起動する準備ができていることが判明した場合、適切なコールバックをトリガーします。
- 既製の実行ループ ツールを使用する以外に、独自の実行ループ ソースを作成したり、実行ループ オブザーバーを登録して実行ループの進行状況を追跡したりできます。
主な落とし穴の 1 つは、実行ループ ソースからのコールバックを待っている間に実行ループを実行するのを忘れることです。これは、メイン スレッドで何かが発生するのをビジー待機することにした場合に問題になることがありますが、独自のスレッドを作成し、その実行ループに実行ループ ソースを登録するときに、この問題に遭遇する可能性が最も高くなります。自動解放プールを確立し、必要に応じて非メイン スレッドで実行ループを実行する責任があります。これは、アプリケーションのメイン関数がそれを行うために存在しないためです。
代わりに、操作キューやディスパッチ ソースなど、実行ループ メカニズムの代替案を提案しているApple のConcurrency Programming Guideを読むことをお勧めします。「スレッドからの移行」の章の「実行ループ コードの置き換え」セクションでは、イベントを処理するために実行ループ ソースの代わりにディスパッチ ソースを使用することを提案しています。
Apple ドキュメントの次の記事をご覧ください。
実行ループを介して非同期接続を実行する方法のサンプル コード:
SimpleURLConnections (ただし、これは NSURLConnection API を使用します)