复制AFHTTPRequestOperation导致错误“请求正文流耗尽”

时间:2013-05-22 19:56:57

标签: ios afnetworking

问题

我的应用可让用户上传照片。这很有效。

现在,如果照片上传失败,我正在尝试实施“重试”功能,例如由于连接速度慢。

这是我的重试代码:

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.HTTPBodyStreamNSInputStream,无法重新启动。

方法-[AFURLConnectionOperation connection:needNewBodyStream:]似乎提供了输入流的副本。我在那里设置了一个断点;复制或启动操作时不会调用它,我不知道如何触发它。

similar issue on the AFNetworking GitHub page进行了一些讨论,但这与在身份验证失败后重试有关。

其他信息

我的网址请求对象是使用-[AFHTTPClient multipartFormRequestWithMethod: path: parameters: constructingBodyWithBlock:]

创建的

1 个答案:

答案 0 :(得分: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

进行调用