0

私が取り組んでいる iOS アプリでは、現在、サーバーへの非同期要求を処理するシングルトン クラスを作成しています。メソッドの 1 つの例を次に示します。

- (void)registerUser:(CBCUserRegistration *)userRegistration delegate:(id)<CBCUserRegistrationDelegate>delegate;

このメソッド内で、NSURLConnection が作成され、非同期リクエストが送信されます。この時点で、デリゲート オブジェクトを NSURLConnection に結び付ける方法が必要です。

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;

が呼び出された場合、どのデリゲートに通知するかを知っています。リクエストは非同期であるため、同時に複数のリクエストが発生する可能性があります。私の最初は、NSURLConnection をキーとして、デリゲートを値として設定して、NSMutableDictionary を使用することでしたが、キーがコピーされるため、それはできません。これを追跡する別の方法を提案できる人はいますか?

前もって感謝します。

4

2 に答える 2

2

これには NSDictionary を使用しないでください。代わりに、オブジェクト指向のアプローチを採用します。

MyConnection必要なコールバックを実装しNSURLConnectionDelegate、型のプロパティ/ivar を持つクラスを作成しますid<CBCUserRegistrationDelegate>。を作成し、その接続のデリゲートを自分自身に割り当てて開始するstartメソッドを に追加します。これで、実行するURL リクエストごとにのインスタンスを作成できます。は を保持し、から受け取った結果を転送します。MyConnectionNSURLConnectionMyConnectionMyConnectionCBCUserRegistrationDelegateNSURLConnection

ただし、ここでデリゲートを使用するのは少し時代遅れです。特にプロジェクトで ARC を使用している場合は、代わりにブロックを使用してください。NSURLConnectionは、非同期リクエストを行う便利な方法を提供します: [NSURLConnection sendAsynchronousRequest:queue:completionHandler:].

例えば:

- (void)registerUser:(CBCUserRegistration *)userRegistration delegate:(id<CBCUserRegistrationDelegate>)delegate
{
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://mysite.com/register"]];
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue]
                           completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
        [delegate processRegistrationResponseData:data];
    }];
}
于 2012-09-26T19:20:45.690 に答える
0

NSURLConnection のアドレスに設定された NSNumber をキーとして使用すると、別の辞書をキーのオブジェクトとして設定できます。名前を付けたり、通知するオブジェクトを記録したりできます。NSURLConnection が解放されたら、忘れずに削除してください。

于 2012-09-26T19:19:06.467 に答える