3

私がやろうとしているのは、次のメソッドの応答を得ることです

 - (void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { }

これを呼び出した後

NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self];
[conn scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
[conn start];

中に

dispatch_async();

しかし、connectionメソッドは呼び出していません。しかし、NSURLConnectionコードを外部で実行するdispatch_asyncと、メソッドが呼び出されます。

その理由は何ですか?また、どうすれば修正できますか?それは、クラス自体ではなく、バックグラウンドスレッドを参照してdelegate参照しているためですか?selfselfUIViewController

4

1 に答える 1

0

initWithRequestループでスケジュールされ、後で開始される接続を作成しているため、startImmediatelyパラメーターを に設定して のレンディションを必ず使用してくださいNO。現在、接続を 2 回開始しています。さらに重要なのは、メインの実行ループでスケジュールする前に開始していることです。

これを修正するには、次のように指定startImmediatelyNOます。

NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO];
[conn scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
[conn start];

そうは言っても、このコードをバックグラウンド キューにディスパッチする必要はまったくないと思います (initWithRequest非同期で実行され、アプリのパフォーマンスに目に見える影響がないため)。NSURLConnection上記のパターンを使用するのは、リクエストをカスタムサブクラスでラップするときだけですNSOperation(この場合、上記のパターンは非常に便利です)。しかし、この場合は不要です。

于 2014-05-06T14:42:20.493 に答える