0

したがって、私のiOSクライアントの場合、POSTを開始して、データの大きなチャンク(たとえば、30MB)を次の方法でアップロードします。

[[NSURLConnection connectionWithRequest:req delegate:self] retain];

ただし、URLが不正な場合(たとえば、404を返す場合)を処理する必要があります。問題は、didSendBodyDataURLが正しいと想定するのと同じように、デリゲートメソッドが32kのチャンクで何度も呼び出されることです。合計ファイルサイズが30MBに達するまで、データに相当します。私は実際にこのメソッドでプログレスバーを表示および表示するための計算を行っています。無効なURLを使用しても、ファイル全体を転送しているように見え、動作します(実際に何が起こっているのかわかりません。実際には何もしていません。URLは404に解決されます!)

次に、想定されるアップロードの20秒後、didReceiveResponse最終的にデリゲートメソッドが呼び出され、NSURLResponseをチェックして、404が提供されたことを確認できます。なんらかのエラーが発生する前にファイル全体が転送されるように見えるのはなぜですか?を使用して[NSURLConnection connectionWithRequest]、実際に何かを実行する前に、これが404であったことをどのように知ることができますか?とにかくメソッドで伝えるdidSendBodyData方法、または私が見ているものよりも早く伝える他の方法はありますか?

さらに大きな問題は、アップロード時間を制限することで、x秒後に停止し、その時点で接続をキャンセルします(didSendBodyDataメソッドの途中で)。そのため、何も知る方法がないようです。 URLが間違っていました。

これは途方もなく簡単な解決策があるはずですが、私はそれを見ていません。助けてくれてありがとう。

4

2 に答える 2

1

仕様に基づくと、HTTP サーバーが HTTP 要求を完全に受信するまで HTTP 応答を返すとは思えません。これは、大量のデータをどこにも送信していなくても、表示されている動作が予期されていることを意味します。

リクエストでHTTP Expect ヘッダーを送信してみてください。それ以外の場合は、URL エンドポイントが存在するかどうかを確認するために予備の ping 要求を送信することを検討しましたか? 多分データのないPOST?次に、コストのかかるリクエストを行う前に、404 について調べることができます。

于 2012-08-02T01:57:52.670 に答える
0

NSURLConnectionDataDelegateを実装しましたか?

次のデリゲート メソッドは、次のようなものになる可能性があります。

- (NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)response;

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;

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

応答コードを調べて何らかのアクションを実行するだけの場合は、コードに次を追加します

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response   
{
            NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
                if (httpResponse.statusCode == 404){
                    NSLog(@"Epic Fail");
                }
        ...

        ...
}
于 2012-08-01T19:53:09.203 に答える