15

iPhoneでソケット通信を学んでいるのですが、そのガイドに何か書いてCFRunloopありました(のガイドですCFNetwork、iOSで使えますか?) iOSのrunloopはどこで学べますか?

4

3 に答える 3

41

Apple のThreading Programming Guideの「Run Loops」の章を見てください。簡単に言えば:

  • 各スレッドに関連付けられた実行ループが 1 つあります。
  • 何かを行うには、実行ループを実行する必要があります。Apple のアプリケーションの main 関数が、メイン スレッドでこれを処理します。
  • 実行ループは特定のモードで実行されます。「共通モード」は実際にはモードのセットであり、そのセットにモードを追加するための API があります。
  • 実行ループの主な目的は、タイマーを監視し、ループ ソースを実行することです。各ソースは、特定のモードの特定の実行ループに登録され、実行ループがそのモードで実行されている適切なタイミングでのみチェックされます。
  • 実行ループは、タイマーのチェックや他のイベント ソースのチェックなど、ループを一周するたびにいくつかの段階を通過します。いずれかのソースが起動する準備ができていることが判明した場合、適切なコールバックをトリガーします。
  • 既製の実行ループ ツールを使用する以外に、独自の実行ループ ソースを作成したり、実行ループ オブザーバーを登録して実行ループの進行状況を追跡したりできます。

主な落とし穴の 1 つは、実行ループ ソースからのコールバックを待っている間に実行ループを実行するのを忘れることです。これは、メイン スレッドで何かが発生するのをビジー待機することにした場合に問題になることがありますが、独自のスレッドを作成し、その実行ループに実行ループ ソースを登録するときに、この問題に遭遇する可能性が最も高くなります。自動解放プールを確立し、必要に応じて非メイン スレッドで実行ループを実行する責任があります。これは、アプリケーションのメイン関数がそれを行うために存在しないためです。

代わりに、操作キューやディスパッチ ソースなど、実行ループ メカニズムの代替案を提案しているApple のConcurrency Programming Guideを読むことをお勧めします。「スレッドからの移行」の章の「実行ループ コードの置き換え」セクションでは、イベントを処理するために実行ループ ソースの代わりにディスパッチ ソースを使用することを提案しています。

于 2011-06-02T15:32:50.783 に答える
6

Apple ドキュメントの次の記事をご覧ください。

メインイベントループ

ループを実行する

実行ループを介して非同期接続を実行する方法のサンプル コード:

SimpleURLConnections (ただし、これは NSURLConnection API を使用します)

于 2011-06-02T15:40:07.660 に答える