2011-10-28 7 views
0

おかげで事前iphoneで複数のデリゲートを使用するにはどうすればよいですか?

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { 
[responseData setLength:0]; 
} 

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

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { 
NSLog([NSString stringWithFormat:@"Connection failed: %@", [error description]]); 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 
[connection release]; 
//do something with the json that comes back ... (the fun part) 
} 

- (void)viewDidLoad 
{ 
[self searchForStuff:@"iPhone"]; 

} 

-(void)searchForStuff:(NSString *)text 
{ 
responseData = [[NSMutableData data] retain]; 
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.whatever.com/json"]]; 
[[NSURLConnection alloc] initWithRequest:request delegate:self]; 
} 

に、私はあなたがインスタンスを使用することができ、Webアクセス

答えて

2

のためのPHPを使用しています、それをachiveする方法を、私はJSONを使用するためにコードの下に使用していますが、私は同じページでより多くのURL接続が必要です接続へのポインタを保持する変数。デリゲートのコールバックで、ポインタの等価性をチェックして、どのコネクションを扱っているかを調べます。

+0

私は客観的なCの方が新しいですのでplzにコードを教えてください –

+0

まず、いくつかの簡単なことを構築し、Objective Cのハングアップを取得し、いくつかのチュートリアルに従ってみてください。またはDan Raysの優れたソリューションを使用してください。 – Rengers

0

これを行わないでください。

代わりに鮮やかなASIHTTPRequestライブラリを使用してください。これにより、すべての作業がはるかに簡単になります。文字通り、私は数年前にASIを発見して以来、私は一つではなく一つのNSURLConnectionを書いています。

ASIのブロック・インターフェースを使用すると、要求オブジェクトを起動する前にそのハンドラ・コードで構成でき、委任の必要がなくなります。

__block ASIHTTPRequest *r = [ASIHTTPRequest requestWithUrl:myNSURLObject]; 
[r setCompletionBlock:^{ 
    NSLog([r responseString]); //for instance 
}]; 
[r startAsynchronous]; 

ブロックがあなたを怖がらせる場合、あなたはまた、特定の方法で特定の要求を指すことができますので、さまざまな要求タイプは別々に処理することができます。NSValueはNSCopyingに準拠したよう

- (void) viewDidLoad { //or wherever 
    ASIHTTPRequest *r = [ASIHTTPRequest requestWithUrl:myFirstURL]; 
    r.delegate = self; 
    [r setDidFinishSelector:@selector(requestDone:)]; 
    [r startAsynchronous]; 
} 

// then later on... 
- (void)requestDone:(ASIHTTPRequest *)request 
{ 
    NSString *response = [request responseString]; 
} 
+1

私はブロックベースのアプローチが好きですが(NSURLConnectionで使用したいと思っていますが)、ASIHTTPRequestは開発者がサポートしていないため、使用しないでください。まだサポートされている類似のライブラリがあります。詳細については、ASIHTTPRequestのブログを参照してください。http://allseeing-i.com – codecaffeine

+0

@codecaffeine - うわー....私は分かりませんでした。ああ、私は家族が死亡したような気分です。ホウ交換のために周りを見始めなければならない、と思う。私は元の苦しみに戻っていません。 –

+0

ええ、私はブロックベースのURLの読み込みがより理にかなって簡単だと思います。私はAppleがNSURLConnectionに類似したものを追加してくれることを願っていますhttp://allseeing-i.comのブログには、いくつかの代替案が掲載されています。 – codecaffeine

1

私はラップするためにそれを使用します接続へのポインタを入力し、これをキーとして使用してNSMutableDictionaryから関連するデータにアクセスします。たとえば、次のようなことが考えられます。

-(void)searchForStuff:(NSString *)text withTarget:(id)target selector:(SEL)selector { 
    responseData = [[NSMutableData data] retain]; 
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.whatever.com/json"]]; 
    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:target,@"target",NSStringFromSelector(selector),@"selector",nil]; 
    NSURLConnection *c = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
    [myMutableDictionary setObject:options forKey:[NSValue valueWithPointer:c]]; 
    [c release]; 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 
    NSValue *p = [NSValue valueWithPointer:connection]; 
    NSDictionary *options = [myMutableDictionary objectForKey:p]; 
    if (options) { 
     id target = [options objectForKey:@"target"]; 
     SEL selector = NSSelectorFromString([options objectForKey:@"selector"]); 
     if (target && selector && [target respondsToSelector:selector]) { 
      [target performSelector:selector withObject:responseData]; 
     } 
    } 
} 
0

実際には、複数の代理人は必要ありません。複数のNSURLConnectionが必要で、どのメソッドがデリゲートメソッドを呼び出すかを調べることができます。

たとえば、以下のインスタンス変数(またはプロパティ)と仮定:

NSURLConnection *connectionA; 
NSURLConnection *connectionB; 
NSMutableData *dataA; 
NSMutalbeData *dataB; 

まず、あなたは、各NSURLConnection変数

-(void)searchA:(NSString *)text 
{ 
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://www.a.com/%@", text]]]; 
    connectionA = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
} 

-(void)searchB:(NSString *)text 
{ 
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://www.b.com/%@", text]]]; 
    connectionB = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
} 

をインスタンス化次に、あなたがに基づいてデリゲートメソッドを呼び出すされた接続を参照して、実装をカスタマイズするためにテストすることができます接続

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
    if (connection == connectionA) { 
     [dataA appendData:data]; 
    } 
    else if (connection == connectionB) { 
     [dataB appendData:data]; 
    } 
} 

デリゲートメソッドごとにこれを行う必要があります。

+0

それは動作していますが、connectionDidFinishLoadingの使用方法 –

+0

同様の方法で、すべてのデリゲートメソッドをconnection:didReceiveData:に書くことができます。それぞれの接続に基づいて動作をカスタマイズするには、 "if ... else if"を使用します。 – codecaffeine

関連する問題