4

NSURLConnection を作成してリクエストを発行すると、すべてがうまくいくことに気付きました。デリゲート メソッドが呼び出され、接続を呼び出すコード ブロックが完了した後、最後のデリゲート メソッドが呼び出されます。偉大な。

これにより、接続が非同期であり、マルチスレッドであることを意味すると思います。あれは正しいですか?それらは非同期ですが、同じスレッド内にありますか? いいえ、それはおかしいですよね?

しかし、NSOperation を使用して私が見たすべての例では、NSURLConnections は常に ScheduledInRunLoop であり、その後 [runLoop runMode ...] が while ループで呼び出されます。

誰かがここで何が起こっているのか正確に説明できますか? 最初のケースではセカンダリスレッドを生成する必要がありますが、(これらのスレッドで) 実行ループを手動で呼び出す必要はありませんが、NSOperation (新しいスレッドで) では実行ループを手動で呼び出す必要があります。

最初のケースで手動呼び出しが必要ないのはなぜですか?

4

3 に答える 3

4

NSURLConnectionは、それ自体のすべてのインスタンスを管理するために単一のバックグラウンドスレッドを生成しますが、接続がスケジュールされたrunloopを所有するスレッドでデリゲート呼び出しが行われるため、これは通常、呼び出し元には関係ありません。私は最近ですが、これらのことは、マルチスレッドアプリで非常識なクラッシャーを処理するときにのみ発生します。)

発信者関連の詳細については、のドキュメントを参照してください-[NSURLConnection scheduleInRunLoop:forMode:]。スケジューリングとアンスケジューリングを手動で処理する方法、およびマルチスレッド環境でNSURLConnectionsがどのように動作するかについて説明します。

実行ループがどのように機能し、追加のスレッドを必要とせずに非同期アクションを実行するかが不明な場合は、 『スレッドプログラミングガイド』の「実行ループ」をお読みください。これは、より高度なCocoa開発に移行するための非常に重要なトピックです。

于 2011-03-03T22:36:27.560 に答える
0

メインスレッドにはすでに実行ループがあるので、私は想像します。

于 2011-03-03T22:26:25.077 に答える
0

別のスレッドで NSURLConnection を実行する場合は、スレッドのメイン メソッドで次のような実行ループを作成する必要があります。

while (!finished)
{
  [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]];
}
于 2013-08-15T14:08:53.040 に答える