15

2つのNSURLConnectionsがあります。2つ目は、1つ目の内容に依存するため、接続から受信したデータの処理は、2つの接続で異なります。

私はObjective-Cを取り上げているところですが、デリゲートを実装する適切な方法を知りたいと思います。

現在、私は以下を使用しています:

NSURL *url=[NSURL URLWithString:feedURL];
NSURLRequest *urlR=[[[NSURLRequest alloc] initWithURL:url] autorelease];
NSURLConnection *conn=[[NSURLConnection alloc] initWithRequest:urlR delegate:self];

自分をデリゲートとして使用したくないのですが、異なるデリゲートとの2つの接続を定義するにはどうすればよいですか?

NSURLConnection *c1 = [[NSURLConnection alloc] initWithRequest:url delegate:handle1];
NSURLConnection *c2 = [[NSURLConnection alloc] initWithRequest:url delegate:handle2];

実装としてhandle1とhandle2を作成するにはどうすればよいですか?またはインターフェース?私はあなたがこれをどのように行うのか本当にわかりません。

どんな助けでも素晴らしいでしょう。

ありがとう、ブライアン・ジャンフォルカロ

4

6 に答える 6

14

ベン、あなたの情報は役に立ちましたが、私が尋ねた質問に完全には答えていませんでした.

私は最終的に、私が本当に求めていた、自分自身のデリゲートを設定する方法を見つけました。

私はそれを次のように実装しました:

@interface DownloadDelegate : NSObject 
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;
@end

@implementation DownloadDelegate
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
}
@end

次のようにデリゲートを使用します。

DownloadDelegate *dd = [DownloadDelegate alloc];
NSURLConnection *c2 = [[NSURLConnection alloc] initWithRequest:url delegate:dd];

同じ立場の誰かを助けることを願っています.Benの助けに感謝します.

ありがとう、

ブライアン・ジャンフォルカロ

于 2008-10-15T20:52:14.663 に答える
10

複数の接続をクリーンな方法で処理する最善の方法は、単一のデリゲートを保持し、各 NSURLConnection をタグで識別することだと思います (これは、 http: //www.isignmeout.com から読んでコピーできる非常に単純なサブクラスです) 。 /multiple-nsurlconnections-viewcontroller/ )

基本的に、識別タグを使用してすべての NSURLConnection を初期化すると、デリゲートでそのタグを取得し、必要なロジックに従って Switch-Case を使用して処理できます。

アップデート

サブクラス化された NSURLConnection を単純なカテゴリに変えました - 少し単純できれいです

https://github.com/Shein/Categories

于 2010-10-25T09:18:04.840 に答える
4

サンプルでは、​​DownloadDelegate オブジェクトを初期化せずに割り当てます。

    DownloadDelegate *dd = [DownloadDelegate alloc];

これは危険です。その代わり:

    DownloadDelegate *dd = [[DownloadDelegate alloc] init];

また、 @interface 宣言でデリゲート応答メソッドを宣言することは厳密には必要ではありません (もちろん害はありませんが)。最後に、connection:didFailWithError: と connectionDidFinishLoading: を実装して DownloadDelegate オブジェクトを解放するようにしてください。そうしないとリークします。

順調に進んでいてよかったです!

于 2008-10-16T03:07:50.660 に答える
3

デリゲートは、標準の NSObject から派生したオブジェクトとして実装されます。

両方の接続を同じデリゲートに向けることができます。

デリゲートは、キャッチしたい NSURLConnectionDelegate メソッドを実装する必要があります (-connection:didReceiveData: や -connectionDidFinishLoading: など)。これらのメソッドは、必要に応じてデリゲートによって呼び出されます。

于 2008-10-15T00:43:12.373 に答える
1

http://github.com/leonho/iphone-libs/tree/masterにあるMultipleDownloadクラスを試してみてください。このクラスは、複数のNSURLConnectionオブジェクトを処理します。

于 2008-11-12T18:44:26.223 に答える
0

デリゲートは非同期で呼び出されるため、didfinishloading をランダムな順序で呼び出すことができます。次に、状態チェックを使用して、続行する前に「その他の」ダウンロードがまだ完了しているかどうかを判断できます。

私は2つのデリゲートを使用します:

たとえば (これは疑似 oc です):

jsondelegate = [[JSonDelegate alloc]initWithCaller:self andSelector:@selector(jsonDone:)]
otherdelegate = [[OtherDelegate] initWithCaller:self andSelector:@selector(otherDone:)]

各デリゲートが終了すると、デリゲートは 2 つの done メソッドを呼び出して呼び出し元に通知します。

各 done メソッドは URL データを受け取り、その状態を ivar に保存します。次に、他の ivar が設定されているかどうかを確認し、両方が完了している場合は処理を続行します。

if(self.jsonString && self.otherData){
  continueProcessing
}

お役に立てれば。

于 2009-12-03T23:02:03.373 に答える