0

次のような非同期タイプを使用してサーバーに URL を投稿しようとしています

_urlConn = [[NSURLConnection alloc] initWithRequest:_urlReq delegate: self];

適切な応答が得られ、didRecieveResponse や connectionDidFinishLoading などのデリゲート メソッドを使用して適切に応答を処理しています。流れは今のところ問題なく動いています。明確に理解できなかった新しい問題に直面しています。

同じ URL を投稿するボタンがあるとします。

  1. ボタンをクリックしてURLを投稿しています
  2. ボタンが再度クリックされると (1/2 秒以内)、URL は投稿されません (私はロジックを書きました)。
  3. URL が投稿され (最初のボタン クリックの場合)、今まで応答がありませんでした。現在、URL を投稿するボタンをもう一度クリックしようとしています。

私のアプリはまさにここにあります。_ReleaseObject(_urlConn);メソッドでを使っているからでしょうかconnectionDidFinishLoading????

4

2 に答える 2

1

同じデリゲートで複数の同時ダウンロードを処理することについて、ここで誰かの質問に答えました。(@Jefferyは正しいです-接続オブジェクトをキーにして、それぞれの状態を維持する必要があります)。

これがあなたの特定の例をどのように処理するかです...

- (IBAction)postButtonPressed:(id)sender {

    sender.enabled = NO;  // no more presses until we are ready again

    [UIView animateWithDuration:0.3 animations:^{
        sender.alpha = 0.3;  // or some effect to make your button appear disabled
    }];

    NSURLRequest *request = // build your post request here

    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue]
        completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {

            // check for error, do whatever you intend with the response
            // then re-enable the button
            sender.enabled = YES;
            [UIView animateWithDuration:0.3 animations:^{sender.alpha=1.0;}];
    }];
}
于 2012-06-18T15:50:58.197 に答える
1

デリゲート コールバックを操作するときは、十分に注意する必要があります。

この例では、1 つのオブジェクトが 2 つの同時 NSURLConnection オブジェクトのデリゲートです。これは悪い考えです。特定の接続を適切な応答データ オブジェクトに関連付ける方法を開発しない限り、応答データが混在することになります。この場合、connection (に渡されるパラメーター) の代わりに _urlConn (iVar だと思います) を使用すると、状況が悪化します-connectionDidFinishLoading:

このすべてを簡素化するには、既存のリクエストが保留中の場合は新しいリクエストを作成しないか、新しいリクエストを開始する前に古いリクエストをキャンセルする必要があります。

于 2012-06-18T14:32:47.387 に答える