0

どのリクエストがデリゲートメソッド内にあるのかを確認する最良の方法は何ですか:

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

}

今、私はリクエストを行う前に NSURLConnection に設定した NSURLConnection を持ってdidReceiveResponseいます。

if (self.tempConnection == connection)

ただし、競合状態では機能しない可能性があります。これを行うより良い方法はありますか?

4

3 に答える 3

5

OS5にはもっと良い方法があります。面倒なデリゲート メッセージはすべて忘れてください。接続にデータを構築させ、完成したコードを開始コードに合わせて配置します。

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.site.com"]];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];

[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
{
    NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*)response;
    NSLog(@"got response %d, data = %@, error = %@", [httpResponse statusCode], data, error);
}];
于 2012-04-27T22:14:03.957 に答える
1

これを行うためのさまざまな方法を検討しましたが、管理するための最もクリーンで簡単な方法は、ブロックパターンを使用することです。そうすれば、完了時に適切な要求に応答することが保証され、競合状態を回避できます。また、非同期呼び出し中に変数やオブジェクトがスコープ外になるという問題は発生しません。また、コードの読み取り/保守もはるかに簡単です。

ASIHTTPRequestAPIとAFNetworkingAPIはどちらもブロックパターンを提供します(ただし、ASIはサポートされなくなったため、新しいものにはAFNetworkingを使用するのが最適です)。これらのライブラリのいずれかを使用したくないが、自分で使用したい場合は、AFNetworkingのソースをダウンロードして、それらの実装を確認できます。しかし、それはほとんど価値のない多くの余分な作業のようです。

于 2012-04-27T22:13:44.430 に答える
1

デリゲートとして機能する別のクラスを作成することを検討してください。次に、生成された NSURLConnection ごとに、デリゲート クラスの新しいインスタンスをその NSURLConnection に対してインスタンス化します。

これを説明する簡単なコードを次に示します。

@interface ConnectionDelegate : NSObject <NSURLConnectionDelegate>

...次に、.m ファイルにメソッドを実装します

さて、UIViewController サブクラス (または別の目的を果たす他のクラス) に投稿したコードがあると思いますか?

リクエストを開始する場所はどこでも、次のコードを使用します。

ConnectionDelegate *newDelegate = [[ConnectionDelegate alloc] init];
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"<url here">]];
[NSURLConnection connectionWithRequest:request delegate:newDelegate];

//then you can repeat this for every new request you need to make
//and a different delegate will handle this
newDelegate = [[ConnectionDelegate alloc] init];
request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"<url here">]];
[NSURLConnection connectionWithRequest:request delegate:newDelegate];

// ...continue as many times as you'd like
newDelegate = [[ConnectionDelegate alloc] init];
request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"<url here">]];
[NSURLConnection connectionWithRequest:request delegate:newDelegate];

それらを追跡するために、すべてのデリゲート オブジェクトを NSDictionary またはその他のデータ構造に格納することを検討してください。connectionDidFinishLoading で NSNotification を使用して、接続が完了したという通知を投稿し、応答から作成されたオブジェクトを提供することを検討します。それを視覚化するのに役立つコードが必要かどうかを教えてください。お役に立てれば!

于 2012-04-27T23:26:17.120 に答える