1

NSMutableURLRequestとを使用してNSURLConnectionサーバーにデータを送信するiOSアプリに取り組んでいます。失敗したときにエラーメッセージを表示する必要があります。リクエストを送信するための私のコードを以下に示します

const int TIMEOUT = 120;

-(void)send:(id<NSURLConnectionDelegate>)delegate
{
    bodyContents = [bodyContents stringByAppendingFormat:@"--%@--",boundry];
    NSData *data = [bodyContents dataUsingEncoding:NSUTF8StringEncoding];
    [request setHTTPBody:data];
    [request setValue:[NSString stringWithFormat:@"%i",[data length]+4] forHTTPHeaderField:@"Content-Length"];
    NSLog(@"Timeout before setting custom is %f",request.timeoutInterval);
    [request setTimeoutInterval:TIMEOUT];
    NSLog(@"Timeout after setting custom is %f",request.timeoutInterval);
    NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:request delegate:delegate];
    if(connection)
        NSLog(@"Connection good");
    else
        NSLog(@"Connection not so good");
}

//in the delegate class
-(void)connectionDidFinishLoading:(NSURLConnection*)connection
{
    NSLog(@"connectionDidFinishLoading");
}

-(void)connection:(NSURLConnection*)connection didFailWithError:(NSError *)error
{
    NSLog(@"Failed with error %@",error);
    btnCancel.title = @"Retry";
    self.navigationItem.hidesBackButton = NO;
    [self showAlertDialog:[NSString stringWithFormat:@"%@",[error localizedDescription]] :@"Error"];
}

2分間応答がない場合、didFailWithErrorメッセージが呼び出されると思います。代わりに、約15秒間応答がない場合に呼び出されますが、これは意味がありません。ドキュメントを見て、タイムアウトを間違って設定していないかどうかを確認しました。唯一見つけたのは、本文のある投稿の最小タイムアウトは240秒であり、これを惜しみなく受け入れるようになりました。

アプリの実行からの出力は次のようになります。

2012-06-22 16:49:12.393メディアアップロード[672:707]カスタムを設定する前のタイムアウトは240.000000です

2012-06-22 16:49:12.394メディアアップロード[672:707]カスタム設定後のタイムアウトは240.000000です

2012-06-22 16:49:12.395メディアアップロード[672:707]接続が良好

2012-06-22 16:49:29.174メディアのアップロード[672:707]エラーで失敗しましたエラードメイン=NSURLErrorDomainコード=-1001「リクエストがタイムアウトしました。」等

なぜこんなに早くタイムアウトするのか、私は少し混乱しています。接続が作成されたときにサーバーが起動していないので、接続があまり良くないのではなく、接続が良いと表示される理由さえわかりませんが、それは別の問題です(私は願っています)何か提案はありますか?

4

1 に答える 1

2

ですから、答えはすべてセマンティクスにあるのではないかと思います。

「接続があまり良くない」ではなく「接続が良い」ログについては、接続を開始してもネットワーク上で何かが行われるのを待たないためです。すぐに開始しますが、initメソッドから戻る前には開始しません

より興味深い(read:misleading)問題は、タイムアウトです。タイムアウト設定が実際に意味するのは、「接続を確立したが、サーバーがまだ応答バイトを提供していない場合」だと思います。これは「試したが接続できない」とは異なります。このように考えると、ある程度意味があります。1つはすべての「ネットワーク」関連(ルーティングとハンドシェイク)用のタイムアウト値で、もう1つは処理される実際のペイロード用です。

于 2012-06-23T00:03:11.783 に答える