5

私は次のように NSURLConnection を作成しています:

theConnection = [[NSURLConnection alloc] initWithRequest:serviceRequest delegate:self];

NSURLConnection のドキュメントを調べたところ、非同期リクエストに対してキャンセル API が機能しているようですが、シナリオで機能しますか?

とにかく、NSURLConnectionが進行中の他のクラスでは、これをやろうとしています:

[mgr.theConnection cancel];
[mgr.theConnection release];

ただし、デリゲートはまだ呼び出されますが、これは望ましくありません。では、デリゲート呼び出しもキャンセルされるように、接続をキャンセルするにはどうすればよいでしょうか?

コンソール:

2012-08-17 23:01:11.820 app[14097:707] Will cancel connection=(null)
2012-08-17 23:01:11.821 app[14097:707] Did cancel connection
2012-08-17 23:01:11.821 app[14097:707] Did release connection
2012-08-17 23:01:20.330 app[14097:707] didReceiveResponse
2012-08-17 23:01:20.331 app[14097:707] didReceiveData
2012-08-17 23:01:20.332 app[14097:707] connectionDidFinishLoading
4

2 に答える 2

4

明らかに、明確ではない何かが起こっています。私が提案するのは、実際にタイミングが思ったとおりであることを確認するために、いくつかのログメッセージを追加することです。

// Add a simple log like (NSLog(@"%@", @"conn_del"); to all your delegate methods)

Then addend you cancelation code with this:
NSLog(@"Will cancel connection=%@", mgr.theConnection);
[mgr.theConnection cancel];
NSLog(@"Did cancel connection");
// [mgr.theConnection release]; assuming a retained property, this is not the way to do it
mgr.theConnection = nil; // this is the proper way - release and nil out the property
NSLog(@"Did release connection");

コードをキャンセルしましたが、数年間テストされていますが、問題はありません。上記のテストから何かを学ぶことができると思います。コンソールに「接続をキャンセルしましたか」と表示された後、メッセージが表示されると聞いてショックを受けますが、「Will」ログとログの間にある可能性があります。

編集:テストごとに、mgrまたはmgrのtheConnectionプロパティはnilです。これが問題の根本的な原因です。なぜそのnilであるかを理解して修正すると、接続はキャンセルされ、同じNSLogはその後デリゲートメッセージを表示しなくなります。

于 2012-08-17T23:22:56.327 に答える