2

重複の可能性:
2 つの NSURLConnection
NSURLConnection デリゲートの管理

異なる NSURLConnections を呼び出す 2 つの異なるメソッドがあります。

方法 A

NSURLConnection *serverConnection = [[NSURLConnection alloc]initWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:addressOfSideWebService]] delegate:self];

方法 B

NSURLConnection *serverConnection = [[NSURLConnection alloc]initWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:addressOfMainWebService]] delegate:self];

問題は、これらの NSURLConnections の両方が同じデリゲートをトリガーすることです。

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    [self.serverData appendData:data];
}

-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{    
    NSString *response = [[NSString alloc]initWithData:self.serverData encoding:NSUTF8StringEncoding];
    // use data
}

私が知りたいのは、NSURLConnections ' または NSURLConnection と呼ばれるメソッドにタグを付けて、どの関数またはメソッドを識別してそれに基づいて行動できるかということです。

別のデリゲートを設定できますか、それとも従うべき他の方法論はありますか?

私が明確であったことを願っています。他の情報を提供できます。ありがとう。

4

3 に答える 3

5

次のようなプロパティを設定しない理由:

NSURLConnection *serverConnection1;
NSURLConnection  *serverConnection2;

次に、次のように使用します。

serverConnection1 = [[NSURLConnection alloc]initWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:addressOfSideWebService]] delegate:self];

次に、デリゲート メソッドで、それがどの接続であるかを確認します。

if (connection == serverConnection1) {
    //Do stuff
} else if (connection == serverConnection2) {
    //Do other stuff
}
于 2012-07-22T20:57:44.977 に答える
3

既存のコードは、問題の原因である両方の呼び出しのデリゲートとして「self」を使用しています。

これを処理する最善の方法は、応答ハンドラーごとに個別のクラスを作成することです。これにより、コードをクリーンに保つことができます。これらのクラスは、応答処理コードを含む NSURLConnectionDelegates である必要があります。

呼び出し元のクラスから NSURLConnection を作成するときは、作成時に正しいデリゲートを設定していることを確認してください。

これで、各 NSURLConnections は、終了時に指定されたクラスにコールバックします。

したがって、呼び出しクラスは次のようになります。

#import "FeedDownloader.h"
#import "URLConnectionResponseScenarioADelegate.h"

@implementation FeedDownloader

- (id)init {

    URLConnectionResponseScenarioADelegate *connectionDelegate = [[URLConnectionResponseScenarioADelegate alloc] init];
    NSURLConnection *myConnection = [[NSURLConnection alloc] initWithRequest:[[NSURLRequest alloc] initWithURL:[[NSURL alloc] initWithString:@"http://www.apple.com"]]  delegate:connectionDelegate];

    [myConnection start];
    return self;
}

@end

応答ハンドラ クラスは次のようになります。

#import "URLConnectionResponseScenarioADelegate.h"

@implementation URLConnectionResponseScenarioADelegate
@synthesize data;

#pragma mark NSURLConnection delegate methods

// The following are delegate methods for NSURLConnection. Similar to callback functions, this is how the connection object,
// which is working in the background, can asynchronously communicate back to its delegate on the thread from which it was
// started - in this case, the main thread.

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    self.data = [NSMutableData data];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)_data {
    [self.data appendData:_data];
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {

}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {

}


@end
于 2012-07-22T20:46:04.710 に答える
1

Radesix は良い方法を提案しましたが、少しやり過ぎかもしれません。これを修正する簡単な方法は、各 NSURLConncection を個別の ivar に格納し、デリゲート メソッドでポインターが等しいかどうかを確認することです。

self.serverConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self];

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    if(connection == self.serverConnection) {
        //Do A
    } else {
        //Do B
    }
}
于 2012-07-22T21:15:34.367 に答える