2

問題

私のアプリでは、ユーザーが写真をアップロードできます。これはうまくいきます。

現在、接続が遅いなどの理由で写真のアップロードが失敗した場合に、「再試行」機能を実装しようとしています。

これが私の再試行コードです:

self.operation = [self.operation copy];  // Creates a new operation with the same NSURLRequest

[self.operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {

    // do success stuff

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

    NSLog("%@", error);

}];

[[MyAFHTTPClient sharedClient] enqueueHTTPRequestOperation:self.operation];

起動すると、失敗ブロックが呼び出され、次のように出力されます。

$0 = 0x12636b50 Error Domain=NSURLErrorDomain Code=-1021 "request body stream exhausted" UserInfo=0x12637810 {NSErrorFailingURLStringKey=https://my/long/url/, NSErrorFailingURLKey=https://my/long/url/, NSLocalizedDescription=request body stream exhausted, NSUnderlyingError=0x13046bb0 "request body stream exhausted"}

質問

画像のアップロードを正しく再開するようにコードを変更するにはどうすればよいですか?

私が試したこと

operation.request.HTTPBodyStream問題は、NSInputStream再起動できないことだと思います。

このメソッド-[AFURLConnectionOperation connection:needNewBodyStream:]は、入力ストリームのコピーを提供するように見えます。そこにブレークポイントを設定しました。操作をコピーまたは開始するときに呼び出されず、トリガーする方法がわかりません。

AFNetworking GitHub ページで同様の問題についていくつかの議論がありますが、それは認証失敗後の再試行に関連しています。

他の情報

私のURLリクエストオブジェクトは次を使用して作成されます-[AFHTTPClient multipartFormRequestWithMethod: path: parameters: constructingBodyWithBlock:]

4

1 に答える 1

1

私はこのようなことを試してみます:

-(void)uploadImage:(NSData *)imageData retry:(BOOL)retry
{
    AFHTTPClient *myClient = [[AFHTTPClient alloc] initWithBaseUrl:myBaseURL];
    NSURLRequest *request = [myClient multipartFormRequestWithMethod:@"POST"                                                                                                    
                                                                path:myPath
                                                          parameters:myParametersDictionary
                                           constructingBodyWithBlock:^(id <AFMultipartFormData> formData){
                                               [formData appendPartWithFileData:imageData 
                                                                           name:myImageName 
                                                                       fileName:myFileName 
                                                                       mimeType:@"image/jpg"];
                              }];
    AFHTTPRequestOperation *operation = [myClient HTTPRequestOperationWithRequest:request
                                                                          success:^(AFHTTPRequestOperation *operation, id responseObject) {
                                                                                // do success stuff
                                                                                  }
                                                                          failure:^(AFHTTPRequestOperation *operation, NSError *error) {
                                                                               NSLog("%@", error);
                                                                               if (retry) {
                                                                                   [self uploadImage:imageData
                                                                                               retry:NO];
                                                                               }
                                           }];
    [myClient enqueueHTTPRequestOperation:operation];
}

もちろん、あなたがそれを呼び出すのは初めてretry:YES

于 2013-05-22T20:59:08.207 に答える